十七、代理设计模式
来源:互联网 发布:写英语论文的软件 编辑:程序博客网 时间:2024/04/26 07:43
1. 代理设计模式介绍
代理设计模式,从名字中我们就能知道其大致意思。我们生活中有很多“代理”,比如,租房中介,海外代购等。就是一种本来需要A做的事,让B去代做。
定义:
为其他对象提供一种代理以控制对这个对象的访问。
2. 代理设计模式使用场景
当我们无法直接访问某一个对象时,可以通过一个代理对象间接访问。通常委托对象和代理对象有着相同的接口。
(1)、远程代理,为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实。
- (2)、虚拟代理,是根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象。
- (3)、安全代理,用来控制真实对象访问时的权限。
- (4)、智能引用,当调用真实对象时,代理处理另外一些事。
3. 代理设计模式UML类图
角色介绍:
Subject: 抽象主题类,该类的主要职责是声明真实主题与代理的共同接口方法,该类既可以是一个抽象类,也可以是一个接口。
RealSubject:真实主题,该类定义类代理所表示的真实对象,由其执行具体的业务逻辑方法。
ProxySubject: 代理类,该类持有一个对真实主题的引用,在其所实现的接口方法中调用真实主题对应接口中的方法。
Client:测试类
4. 代理设计模式简单实现
- (1)、抽象主题类:
public interface Subject { void visit();}
抽象主题类中,只有一个visit()方法,代理对象和被代理代理对象均要实现这个方法。
- (2)、真实主题:
public class RealSubject implements Subject { @Override public void visit() { System.out.println("Real Subject"); }}
真实对象中,继承自抽象主题类,在visit()方法中,实现具体逻辑。
- (3)、代理主题:
public class ProxySubject implements Subject { private RealSubject mSubject; public ProxySubject(RealSubject mSubject) { this.mSubject = mSubject; } @Override public void visit() { //通过真实主题引用的对象调用真实主题中的逻辑方法 mSubject.visit(); }}
ProxySubject代理类中有一个真实主题类的引用,同时代理主题类继承了和真实主题类一模一样的抽象类,实现了同样的方法。只不过在代理类中,visit()方法调用了真实主题类的visit()方法。
- (4)、测试类:
public class Client { public static void main(String[] args) { //构建一个真实的主题对象 RealSubject realSubject = new RealSubject(); //通过一个真实的主题对象构造一个代理对象 ProxySubject proxySubject = new ProxySubject(realSubject); //调用代理的相关方法 proxySubject.visit(); }}
以上模式叫做静态代理,还有一种叫做动态代理模式。
静态代理模式就如上述所示,我们的代码在运行前类的class编译文件就已经存在;而动态代理类则与静态代理类相反,通过反射机制动态地生成代理者对象,代理对象将会在执行阶段执行。
方法如下:我们声明一个动态代理类:
public class DynamicProxy implements InvocationHandler { private Object object;//被代理对象的引用 public DynamicProxy(Object object) { this.object = object; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = method.invoke(object, args); return result; }}
在上述代码中,我们实现了动态代理接口InvocationHandler,这是java为我们提供的,我们只需要重写其调用方法invoke即可。
在以上代码中,我们声明了一个Object的引用,该引用将指向被代理类,而我们在invoke方法中调用具体的被代理方法,也就是真实方法。
接着我们修改Client类方法如下:
public class Client { public static void main(String[] args) { RealSubject realSubject = new RealSubject(); //构造一个动态代理对象 DynamicProxy dynamicProxy = new DynamicProxy(realSubject); //类加载器 ClassLoader classLoader = dynamicProxy.getClass().getClassLoader(); Subject subject = (Subject) Proxy.newProxyInstance(classLoader, new Class[]{Subject.class}, dynamicProxy); //调用代理对象的visit方法。 subject.visit(); }}
5. 总结
- 代理设计模式应用比较广泛,缺点较少。
- 十七、代理设计模式
- Android设计模式(十七)-代理模式
- 设计模式(十七)---门面模式
- 【设计模式】之十七Flyweight
- 设计模式(十七)之State
- 设计模式--【代理模式】
- 设计模式:代理模式
- 设计模式--代理模式
- 设计模式---代理模式
- 设计模式-代理模式
- 设计模式---代理模式
- 设计模式 代理模式
- 设计模式-【代理模式】
- 设计模式-代理模式
- 设计模式----代理模式
- 设计模式-代理模式
- 设计模式---代理模式
- 设计模式--代理模式
- Mysql 里CHAR和VARCHAR的最大长度及一些注意事项
- Ubuntu14.04交叉编译U-Boot
- fedora 的学习历程
- 最大子段和的以为与二维求解
- 空心三角形(图形的输出)c语言
- 十七、代理设计模式
- linux下的简单文件服务器和客户端程序
- POJ 2942 Knights of the Round Table(点双联通+二分图+染色)
- 莫比乌斯反演模板
- SQL中 group by 1, order by 1 语句是什么意思
- Object-c------计算代码行数小demo
- Android View 事件分发机制梳理
- Qt应用程序以管理员身份启动
- 16.5.6-7学习内容