设计模式之代理模式
来源:互联网 发布:杜兰 金融 知乎 编辑:程序博客网 时间:2024/06/16 14:04
什么是代理模式(Proxy)
- 为其他对象提供一种代理以控制对这个对象的访问
代理模式的几个角色
- Subject抽象主题角色,可以是一个抽象类或者接口,定义通用的业务
- RealSubject具体主题角色,被代理角色,是业务具体的执行者
- Proxy代理主题角色,也是委托类、代理类,负责对真实对象的应用,可以做预处理或者善后处理
- 示例代码(示例中包括基本的代理模式、强制代理、动态代理)
- 基本的代理模式
package com.pattern.proxy.base;/** * 接口类,所有的具体Subject都要实现这个接口 * @author yjzhou */public interface Subject { public void request();}
package com.pattern.proxy.base;/** * 具体的subject类,实现完成Subject接口中的方法 * @author yjzhou */public class RealSubject implements Subject{ @Override public void request() { System.out.println("具体主题类执行request----"); }}
package com.pattern.proxy.base;/** * 代理类,代理处理Subject类的request的方法 * @author yjzhou */public class ProxySubject implements Subject{ private Subject subject; /** * 通过构造函数传递被代理者 * @param subject */ public ProxySubject(Subject subject) { this.subject = subject; } @Override public void request() { before(); subject.request(); after(); } /** * 预处理 */ private void before(){ System.out.println("代理执行前的预处理-----"); } /** * 后处理 */ private void after(){ System.out.println("代理执行完成后的处理-----"); }}
package com.pattern.proxy.base;/** * 基本的代理模式测试类 * @author yjzhou */public class TestProxy { public static void main(String[] args) { ProxySubject proxy = new ProxySubject(new RealSubject()); proxy.request(); RealSubject realSubject = new RealSubject(); realSubject.request(); }}
- 强制代理
package com.pattern.proxy.force;public interface Subject { public void request(); public Subject getProxy();}
package com.pattern.proxy.force;public class RealSubject implements Subject { private ProxyForce proxy = null; public RealSubject() { // TODO Auto-generated constructor stub } @Override public void request() { if (isProxy()) { System.out.println("具体主题执行reques------"); } else { System.out.println("请使用指定代理访问----"); } } @Override public Subject getProxy() { this.proxy = new ProxyForce(this); return this.proxy; } private boolean isProxy() { if (null == this.proxy) { return false; } else { return true; } }}
package com.pattern.proxy.force;public class ProxyForce implements Subject{ private Subject subject; public ProxyForce(Subject subject) { this.subject = subject; } @Override public void request() { before(); subject.request(); after(); } @Override public Subject getProxy() { return this; } /** * 预处理 */ private void before(){ System.out.println("代理执行前的预处理-----"); } /** * 后处理 */ private void after(){ System.out.println("代理执行完成后的处理-----"); }}
package com.pattern.proxy.force;public class TestProxyForce { public static void main(String[] args) { //需要代理才能操作 RealSubject realSubject = new RealSubject(); realSubject.request(); System.out.println("---------------------------------------"); //不是指定的代理,同样无法操作 ProxyForce proxyForce = new ProxyForce(realSubject); proxyForce.request(); System.out.println("---------------------------------------"); //获得代理正确操作 Subject proxy = realSubject.getProxy(); proxy.request(); System.out.println("---------------------------------------"); }}
- 动态代理
package com.pattern.proxy.dynamic;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class DyProxyHandler implements InvocationHandler{ private Object obj = null; public DyProxyHandler(Object obj) { this.obj = obj; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = method.invoke(obj, args); return result; }}
package com.pattern.proxy.dynamic;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Proxy;import com.pattern.proxy.base.RealSubject;import com.pattern.proxy.base.Subject;public class TestDyProxy { public static void main(String[] args) { Subject subject = new RealSubject(); InvocationHandler handler = new DyProxyHandler(subject); Class<?> cls = subject.getClass(); Subject proxySubject = (Subject) Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces() , handler); proxySubject.request(); }}
0 0
- 设计模式之代理模式
- 设计模式之代理模式
- 设计模式之代理模式
- 设计模式之代理模式
- 设计模式之-代理模式
- 设计模式之 代理模式
- 设计模式之代理模式
- 设计模式之代理模式
- 设计模式之代理模式
- 设计模式之代理模式
- 设计模式之代理模式
- 设计模式之代理模式
- 设计模式之代理模式
- 设计模式之-----代理模式
- 设计模式之代理模式
- 设计模式之-代理模式
- 设计模式之代理模式
- 设计模式之代理模式
- saiku与kylin整合备忘录
- iOS 推送通知授权请求优化
- 哈希表与一致性哈希算法
- NoClassDefFoundError 的奇怪问题
- BaseAdapter相关
- 设计模式之代理模式
- ipconfig命令详细图解
- const使用注意事项 指针 引用,指针引用区别
- openstack on centos 7.1(block storage)
- mysql学习笔记-2.实用的数据库备份和表格备份
- Linux学习之CMake-Cmake3.6.0的下载和安装
- git reset revert 回退回滚取消提交返回上一版本
- MySQL5.6导入‘.frm’、‘.MYD’、‘.MYI’
- android actionbar 网页在线生成style(修改配置)