设计模式之代理模式(Proxy)
2014-08-20 11:29
295 查看
1、定义
代理模式是一个使用率非常高的模式,它为其他对象提供一种代理以控制对这个对象的访问。2、通用类图
subject抽象主题角色:抽象主题类可以是抽象类也可以是接口,是一个最普通的业务类型定义,无特殊要求
RelSubject具体主题角色:也叫做被委托角色、被代理角色。是业务逻辑的具体执行者。
Proxy代理主题角色:也叫委托类、代理类。它负责对真实角色的应用,把所有抽象主题类定义的方法限制委托给真实主题角色实现,并且在真实主题角色处理完毕前后做预处理和善后处理工作。
3、通用源代码
普通代理:package proxy; /** *抽象主题类 * 2014-8-20上午10:24:17-limiracle */ public interface Subject { //定义一个方法 public void request(); }
package proxy; /** *真实主题类 * 2014-8-20上午10:25:15-limiracle */ public class RealSubject implements Subject{ //实现方法 public void request(){ System.out.println("处理中...."); } }
package proxy; public class Proxy implements Subject{ //要代理哪个实现类 private Subject subject=null; //默认被代理者 public Proxy(Subject subject){ this.subject=subject; } //通过构造函数传递代理者 public Proxy(Object...objects ){ } //实现接口中定义的方法 public void request(){ this.before(); this.subject.request(); this.after(); } //预处理 private void before(){ System.out.println("开始代理..."); } //善后处理 private void after(){ System.out.println("结束代理..."); } }
package proxy; public class Main { public static void main(String args[]){ Proxy proxy=new Proxy(new RealSubject()); proxy.request(); } }
动态代理源码
package proxy.dynamic; /** *抽象主题类 * 2014-8-20上午10:24:17-limiracle */ public interface Subject { //定义一个方法 public void request(); }
package proxy.dynamic; /** *真实主题类 * 2014-8-20上午10:25:15-limiracle */ public class RealSubject implements Subject{ //实现方法 public void request(){ System.out.println("处理中...."); } }
package proxy.dynamic; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class MyInvocationHandler implements InvocationHandler{ private Object target=null; public MyInvocationHandler(Object obj){ this.target=obj; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { return method.invoke(this.target, args); } }
package proxy.dynamic; public interface IAdvice { //通知只有一个方法, public void exec(); }
package proxy.dynamic; public class BeforeAdvice implements IAdvice { public void exec(){ System.out.println("我是前置通知,我被执行了!"); } }
package proxy.dynamic; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; public class DynamicProxy<T> { public static <T> T newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h){ //寻找joinpoint连接点,AOP框架使用元数据定义 if(true){ //执行一个前置通知 (new BeforeAdvice()).exec(); } //执行目标,并返回结果 return (T)Proxy.newProxyInstance(loader, interfaces, h); } }
package proxy.dynamic; import java.lang.reflect.InvocationHandler; public class Main { /** * @param args */ public static void main(String[] args) { //定义一个主题 Subject subject=new RealSubject(); //定义一个handler InvocationHandler handler=new MyInvocationHandler(subject); //定义主题的代理 Subject proxy=DynamicProxy.newProxyInstance(subject.getClass().getClassLoader(), subject.getClass().getInterfaces(),handler); //代理行为 proxy.request(); } }
相关文章推荐
- 设计模式之Proxy代理模式
- 设计模式(6)-代理模式(Proxy)
- 设计模式之Proxy(代理)
- NET常用设计模式——代理(Proxy)模式
- 设计模式--代理模式(Proxy Model)
- 设计模式----Proxy(代理)模式
- 设计模式之Proxy(代理)
- 设计模式学习笔记(十三)——Proxy代理模式
- 设计模式之Proxy(代理)
- Java设计模式:Proxy(代理)
- 设计模式与泡mm的关系之Proxy代理模式及代理模式的再思考
- 设计模式 --- 代理模式(Proxy) 精选经验合集
- 设计模式之代理模式(Proxy)
- 设计模式之代理(Proxy)----对象结构型模式
- 设计模式之Proxy(代理)
- Java设计模式:Proxy(代理)
- 设计模式袖珍版 连续转载之 - Proxy(代理)
- 设计模式之Proxy(代理)
- 设计模式之Proxy(代理)
- 设计模式(8)-代理模式(Proxy)