代理模式 The Proxy Pattern
2013-04-25 15:40
351 查看
代理模式
为另一个对象提供一个替身或占位符以控制对这个对象的访问。
1、使用代理模式创建代表(representative)对象,让代表对象控制某个对象的访问,被代理的对象可以是远程的对象,创建开销大的对象或需要安全控制的对象。
类图
1、Subject:Proxy和RealSubject都实现此接口,客户可以像处理RealSubject一样处理Proxy对象。
2、Proxy:持有Subject类型的引用(指向RealSubject)。Proxy会控制对RealSubject的访问。
代理模式在结构上类似装饰者,但是目的不同,装饰者为对象加上行为,而代理则是控制访问。
(一)远程代理(RMI过程)
(二)虚拟代理示例
1、创建了一个用来显示的ImageProxy,页面的请求将由Proxy来处理。
2、在某个时间点,图像被返回,ImageIcon被完整实例化。
3、下次调用到painIcon() 时,代理就委托给ImageIcon
(三)保护代理(用Java的动态代理实现)
在java.lang.reflect包中有自己的代理支持,利用这个包你可以在运行时动态的创建一个代理类,实现一个或多个接口,并将方法的调用转发到你所指定的类。即java的动态代理技术。
1、proxy上的任何方法调用都会被传入InvocationHandler类,InvocationHandler控制对RealSubject的访问。
如下程序:
(1)proxy.say( "tom", 10);
(2)MyInvocationHandler的invoke(Object proxy, Method method, Object[] args)会被调用。
(3)invoke() 方法里设置如何处理请求:可以做一些预处理;可以转发给RealSubject;也可以做其他处理。
程序
Hi TOM, You have been 10 years old.
(转载请注明出处 ^.^)
为另一个对象提供一个替身或占位符以控制对这个对象的访问。
1、使用代理模式创建代表(representative)对象,让代表对象控制某个对象的访问,被代理的对象可以是远程的对象,创建开销大的对象或需要安全控制的对象。
类图
1、Subject:Proxy和RealSubject都实现此接口,客户可以像处理RealSubject一样处理Proxy对象。
2、Proxy:持有Subject类型的引用(指向RealSubject)。Proxy会控制对RealSubject的访问。
代理模式在结构上类似装饰者,但是目的不同,装饰者为对象加上行为,而代理则是控制访问。
(一)远程代理(RMI过程)
(二)虚拟代理示例
1、创建了一个用来显示的ImageProxy,页面的请求将由Proxy来处理。
2、在某个时间点,图像被返回,ImageIcon被完整实例化。
3、下次调用到painIcon() 时,代理就委托给ImageIcon
(三)保护代理(用Java的动态代理实现)
在java.lang.reflect包中有自己的代理支持,利用这个包你可以在运行时动态的创建一个代理类,实现一个或多个接口,并将方法的调用转发到你所指定的类。即java的动态代理技术。
1、proxy上的任何方法调用都会被传入InvocationHandler类,InvocationHandler控制对RealSubject的访问。
如下程序:
(1)proxy.say( "tom", 10);
(2)MyInvocationHandler的invoke(Object proxy, Method method, Object[] args)会被调用。
(3)invoke() 方法里设置如何处理请求:可以做一些预处理;可以转发给RealSubject;也可以做其他处理。
程序
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; interface Subject { public String say(String name, int age); } class RealSubject implements Subject { public String say(String name, int age) { return "Hi "+name + ", You have been " + age+" years old." ; } } class MyInvocationHandler implements InvocationHandler { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { for ( int i = 0; i < args. length; i++) { if (String. class.isInstance(args[i])) { String temp = (String) args[i]; args[i] = temp.toUpperCase(); } } Subject realObj= new RealSubject(); Object temp = method.invoke(realObj, args); return temp; } } public class InvocationHandlerTest { public static void main(String[] args) { Subject proxy = (Subject)Proxy.newProxyInstance( Subject. class.getClassLoader(), new Class[]{Subject. class}, new MyInvocationHandler() ); String info = proxy.say("tom", 10); System. out.println(info); } }输出:
Hi TOM, You have been 10 years old.
(转载请注明出处 ^.^)
相关文章推荐
- Design Pattern学习笔记之代理模式(the Proxy Pattern)
- 代理模式 The Proxy Pattern
- 《Head First设计模式》 读书笔记12 代理模式 The Proxy Pattern
- 巧用代理设计模式(Proxy Design Pattern)改善前端图片加载体验
- 13.代理模式(Proxy Pattern)
- 设计模式之代理模式(Proxy Pattern)
- 【CDP-云设计模式】第4章,8.缓存代理模式(Cache Proxy Pattern)
- 【CDP-云设计模式】第6章,1.写代理模式(Write Proxy Pattern)
- 浅谈 java 设计模式--代理模式(Proxy pattern)
- 我读设计模式之代理模式(Proxy Pattern)
- 代理模式【Proxy Pattern 】
- 设计模式之五S:动态代理模式(Dynamic Proxy Pattern)
- Proxy Design Pattern(代理设计模式)
- 代理模式 Proxy Design Pattern
- 设计模式总结之Proxy Pattern(代理模式)
- Proxy Design Pattern 代理设计模式
- Proxy Design Pattern 代理设计模式
- Design Pattern—— Dynamic Proxy Pattern 动态代理模式
- 设计模式 -- 代理模式 (Proxy Pattern)
- Proxy Design Pattern(代理模式)