赞
踩
定义:
代理模式(Proxy Pattern) :给某一个对象提供一个代理,并由代理对象控制对原对象的引用
对象结构型模式
代理对象可以在客户端和目标对象之间起到中介的作用
通过代理对象去掉客户不能看到的内容和服务或者添加客户需要的额外的新服务
优点:
能够协调调用者和被调用者,在一定程度上降低了系统的耦合度
客户端可以针对抽象主题角色进行编程,增加和更换代理类无须修改源代码,符合开闭原则,系统具有较好的灵活性和可扩展性
缺点:
由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢(例如保护代理)
实现代理模式需要额外的工作,而且有些代理模式的实现过程较为复杂(例如远程代理)
适用范围:
当客户端对象需要访问进程主机中的对象时可以使用进程代理
当需要用一个消耗资源较少的对象来代表一个消耗资源较多的对象, 从而降低系统开销、缩短运行时间时可以使用虚拟代理
当需要为某一个被频繁访问的操作结果提供一个临时存储空间,以 供多个客户端共享访问这些结果时可以使用缓冲代理
当需要控制对一个对象的访问,为不同用户提供不同级别的访问权 限时可以使用保护代理
当需要为一个对象的访问(引用)提供一些额外的操作时可以使用 智能引用代理
Copy-on-Write代理:它是虚拟代理的一种,把复制(克隆)操 作延迟到只有在客户端真正需要时才执行。一般来说,对象的深克 隆是一个开销较大的操作。Copy-on-Write代理可以让这个操作延 迟.只有对象被用到的时候才被克隆。
防火墙(Firewall)代理:保护目标不让恶意用户接近。
同步化(Synchronization)代理:使几个用户能够同时使用一个对象而没有冲突。
实例:
在一个论坛中已注册用户和游客的权限不同,已注册的用户拥有 发帖、修改自己的注册信息、修改自己的帖子等功能;而游客只 能看到别人发的帖子,没有其他权限。使用代理模式来设计该权 限管理模块。在本实例中我们使用代理模式中的保护代理,该代理用于控制对 一个对象的访问,可以给不同的用户提供不同级别的使用权限。
实例UML:
实例目录:
实例代码:
AbstractPermission.java
- package proxy;
-
- public interface AbstractPermission {
- public void modifyUserInfo();
- public void viewNote();
- public void publishNote();
- public void modifyNote();
- public void setLevel(int level);
- }
RealPermission.java
- package proxy;
-
-
- public class RealPermission implements AbstractPermission {
- @Override
- public void modifyUserInfo() {
- System.out.println("修改用户信息!");
- }
-
- @Override
- public void viewNote() {
- System.out.println("浏览帖子");
- }
-
- @Override
- public void publishNote() {
- System.out.println("发布帖子");
- }
-
- @Override
- public void modifyNote() {
- System.out.println("修改帖子");
- }
-
- @Override
- public void setLevel(int level) {
-
- }
- }
PermissionProxy.java
- package proxy;
-
- public class PermissionProxy implements AbstractPermission {
- private RealPermission realPermission= new RealPermission();
- private int level=0;
- @Override
- public void modifyUserInfo() {
- if (level==0){
- System.out.println("对不起,你没有该权限!");
- } else if (level==1){
- realPermission.modifyUserInfo();
- }
-
- }
-
- @Override
- public void viewNote() {
- realPermission.viewNote();
- }
-
- @Override
- public void publishNote() {
- if (level==0){
- System.out.println("对不起,你没有该权限!");
- } else if (level==1){
- realPermission.publishNote();
- }
-
- }
-
- @Override
- public void modifyNote() {
- if (level==0){
- System.out.println("对不起,你没有该权限!");
- } else if (level==1){
- realPermission.modifyNote();
- }
-
- }
-
- @Override
- public void setLevel(int level) {
- this.level=level;
-
- }
- }
XMLUtil.java
- package proxy;
-
- import org.w3c.dom.Document;
- import org.w3c.dom.Node;
- import org.w3c.dom.NodeList;
-
- import javax.xml.parsers.DocumentBuilder;
- import javax.xml.parsers.DocumentBuilderFactory;
- import java.io.File;
-
- public class XMLUtil {
- public static Object getBean() {
- try {
-
- //创建文档对象
-
- DocumentBuilderFactory dFactory=DocumentBuilderFactory.newInstance();
- DocumentBuilder builder =dFactory.newDocumentBuilder();
- Document doc;
- doc=builder.parse(new File("proxy.xml"));
-
- //获取文本节点
-
- NodeList nl=doc.getElementsByTagName("className");
- Node classNode=nl.item(0).getFirstChild();
- String cName=classNode.getNodeValue();
-
-
- Class c=Class.forName(cName);
- Object obj=c.newInstance();
- return obj;
-
- }
- catch(Exception e) {
- e.printStackTrace();
- return null;
- }
- }
- }
Client.java
- package proxy;
-
- public class Client {
- public static void main(String[] args) {
- AbstractPermission permission;
- permission=(AbstractPermission) XMLUtil.getBean();
- permission.modifyUserInfo();
- permission.modifyNote();
- permission.publishNote();
- permission.viewNote();
- System.out.println("=============");
- permission.setLevel(1);
- permission.modifyUserInfo();
- permission.modifyNote();
- permission.publishNote();
- permission.viewNote();
- }
- }
proxy.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <config>
- <className>proxy.PermissionProxy</className>
- </config>
运行结果截图:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。