GOF设计模式-代理模式
2017-02-10 17:31
447 查看
代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
Subject:抽象主题类,声明真实主题与代理的共同接口方法。
RealSubject:真实主题类,定义了代理所表示的真实对象,客户端通过代理类间接的调用真实主题类的方法。
ProxySubject:代理类,持有对真实主题类的引用,在其所实现的接口方法中调用真实主题类中相应的接口方法执行。
Client:客户端类。
来一个代理买车的例子
首先要有个买车的抽象类
真实要买车的对象
代理,代替真实对象买车的,要持有真实对象的资料,不然就真成自己买车了
来个测试类,测一下
代理模式,就是在代理类中持有一个真实类(被代理类)的对象,真正被调用的,还是真实类,就像上面,真实买车的,还是我,而实际买车的确实代理人,这样的话,代理人就可以在中间抽点利润什么的,我也免去了一些来回奔跑的麻烦。
动态代理
上面说的是静态代理,在代码运行前就已经存在了代理类的class编译文件,而动态代理则是在代码运行时通过反射来动态的生成代理类的对象,并确定到底来代理谁。spring 的核心功能之一就是 aop,就是动态代理。
Java提供了动态的代理接口InvocationHandler,实现该接口需要重写invoke()方法。
创建动态代理类
测试类:
代码地址:https://github.com/mazh1992/model/
Subject:抽象主题类,声明真实主题与代理的共同接口方法。
RealSubject:真实主题类,定义了代理所表示的真实对象,客户端通过代理类间接的调用真实主题类的方法。
ProxySubject:代理类,持有对真实主题类的引用,在其所实现的接口方法中调用真实主题类中相应的接口方法执行。
Client:客户端类。
来一个代理买车的例子
首先要有个买车的抽象类
public interface BuyCar { public void getCar(); }
真实要买车的对象
public class My implements BuyCar{ @Override public void getCar() { System.out.println("我:我购买了一辆车"); } }
代理,代替真实对象买车的,要持有真实对象的资料,不然就真成自己买车了
public class ProxyMy implements BuyCar{ private BuyCar buyCar; // 一定要持有真实对象 public ProxyMy(BuyCar buyCar) { this.buyCar = buyCar; } @Override public void getCar() { System.out.println("代理:我是代购,我帮别人代购一辆车"); buyCar.getCar(); System.out.println("代理:代购完成,车辆已经交给客户"); } }
来个测试类,测一下
public class Test { public static void main(String[] args) { BuyCar my = new My(); BuyCar buyCar = new ProxyMy(my); buyCar.getCar(); } }
代理模式,就是在代理类中持有一个真实类(被代理类)的对象,真正被调用的,还是真实类,就像上面,真实买车的,还是我,而实际买车的确实代理人,这样的话,代理人就可以在中间抽点利润什么的,我也免去了一些来回奔跑的麻烦。
动态代理
上面说的是静态代理,在代码运行前就已经存在了代理类的class编译文件,而动态代理则是在代码运行时通过反射来动态的生成代理类的对象,并确定到底来代理谁。spring 的核心功能之一就是 aop,就是动态代理。
Java提供了动态的代理接口InvocationHandler,实现该接口需要重写invoke()方法。
创建动态代理类
public class DynamicProxy implements InvocationHandler { private Object obj; public DynamicProxy(Object obj) { this.obj = obj; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("代理:我是代购,我帮别人代购一辆车"); Object result=method.invoke(obj, args); System.out.println("代理:代购完成,车辆已经交给客户"); return result; } }
测试类:
public class Test { /* public static void main(String[] args) { BuyCar my = new My(); BuyCar buyCar = new ProxyMy(my); buyCar.getCar(); }*/ public static void main(String[] args) { BuyCar my = new My(); DynamicProxy dynamicProxy = new DynamicProxy(my); ClassLoader classLoader = my.getClass().getClassLoader(); BuyCar buyCar = (BuyCar) Proxy.newProxyInstance(classLoader, new Class[]{BuyCar.class}, dynamicProxy); buyCar.getCar(); } }
代码地址:https://github.com/mazh1992/model/
相关文章推荐
- 如何在Tomcat中部署应用的多个版本
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 七、设计模式——装饰模式
- 设计模式总结
- 设计模式之创建型模式
- 浅谈设计模式的学习
- 设计模式---状态模式在web前端中的应用
- Ruby设计模式编程之适配器模式实战攻略
- 实例讲解Ruby使用设计模式中的装饰器模式的方法
- 设计模式中的模板方法模式在Ruby中的应用实例两则
- Ruby设计模式编程中对外观模式的应用实例分析
- 实例解析Ruby设计模式编程中Strategy策略模式的使用
- Ruby中使用设计模式中的简单工厂模式和工厂方法模式
- Ruby使用设计模式中的代理模式与装饰模式的代码实例
- 详解组合模式的结构及其在Ruby设计模式编程中的运用
- C# 设计模式系列教程-建造者模式
- C#编程中使用设计模式中的原型模式的实例讲解
- 使用设计模式中的工厂方法模式进行C#编程的示例讲解