设计模式之代理模式
2013-11-03 22:35
260 查看
1.概念
代理模式就是为对象提供一种代理以控制对这个对象的访问。简而言之,就是用一个对象来代替另外一个对象来控制该对象的访问权限。
2.代理模式的设计实例
代理模式的UML类图如下:
![](http://img.blog.csdn.net/20131103221825687)
以一个实例为例,小张(代理)帮助小马追求小红,代码实现如下:
通用接口类Subject.java如下:
追求者小马类ConcreteSubject.java代表Proxy类操作的真实实体如下:
小紅收到了玫瑰!
小紅收到了巧克力!
小紅收到了情書!
另外,如果要按照上述的方法使用代理模式,那么真实角色必须是事先已经存在的,并将其作为代理对象的内部属性。但是实际使用时,一个真实角色必须对应一个 代理角色,如果大量使用会导致类的急剧膨胀;因此,以上的代理使用方式成为静态代理,此外,如果事先并不知道真实角色,该如何使用代理呢?这个问题可以通过Java的动态代理类来解决。动态代理可以让系统能够根据实际需要来动态创建代理类,让同一个代理类能够代理多个不同的真实主题类而且可以代理不同的方法。
代理模式就是为对象提供一种代理以控制对这个对象的访问。简而言之,就是用一个对象来代替另外一个对象来控制该对象的访问权限。
2.代理模式的设计实例
代理模式的UML类图如下:
以一个实例为例,小张(代理)帮助小马追求小红,代码实现如下:
通用接口类Subject.java如下:
package com.uestc.proxy; public interface Subject { public void operatorA(); public void operatorB(); public void operatorC(); }小红类Schoolgirl.java如下:
package com.uestc.proxy; public class Schoolgirl { private String name; public void setName(String name){ this.name=name; } public String getName(){ return this.name; } }
追求者小马类ConcreteSubject.java代表Proxy类操作的真实实体如下:
package com.uestc.proxy; public class ConcreteSubject implements Subject { Schoolgirl girl; public ConcreteSubject(Schoolgirl girl){ this.girl=girl; } @Override public void operatorA() { System.out.println(girl.getName()+"收到了玫瑰!"); } @Override public void operatorB() { System.out.println(girl.getName()+"收到了巧克力!"); } @Override public void operatorC() { System.out.println(girl.getName()+"收到了情書!"); } }代理类,保存了一个引用使得代理可以访问实体,并提供一个与Subject想同的接口,代码Proxy.java如下:
package com.uestc.proxy; public class Proxy implements Subject { private ConcreteSubject subject; public Proxy(Schoolgirl girl){ subject=new ConcreteSubject(girl); } @Override public void operatorA() { subject.operatorA(); } @Override public void operatorB() { subject.operatorB(); } @Override public void operatorC() { subject.operatorC(); } }运行主类Test.java如下:
package com.main; import com.uestc.proxy.Proxy; import com.uestc.proxy.Schoolgirl; public class Test { /** * @param args */ public static void main(String[] args) { Schoolgirl girl=new Schoolgirl(); girl.setName("小紅"); Proxy proxy=new Proxy(girl);//礼物送给小红 proxy.operatorA(); proxy.operatorB(); proxy.operatorC(); } }运行结果如下:
小紅收到了玫瑰!
小紅收到了巧克力!
小紅收到了情書!
另外,如果要按照上述的方法使用代理模式,那么真实角色必须是事先已经存在的,并将其作为代理对象的内部属性。但是实际使用时,一个真实角色必须对应一个 代理角色,如果大量使用会导致类的急剧膨胀;因此,以上的代理使用方式成为静态代理,此外,如果事先并不知道真实角色,该如何使用代理呢?这个问题可以通过Java的动态代理类来解决。动态代理可以让系统能够根据实际需要来动态创建代理类,让同一个代理类能够代理多个不同的真实主题类而且可以代理不同的方法。
相关文章推荐
- 设计模式-代理模式(Proxy Pattern)
- Java设计模式9:代理模式
- 优雅的表单验证模式--策略设计模式和ES6的Proxy代理模式
- 设计模式的应用场景(8)--代理模式
- 【设计模式】学习笔记15:代理模式(Proxy Pattern)
- 【23种设计模式从零学4-代理模式】
- objective-c protocol和protocol代理设计模式
- java设计模式之代理模式
- 设计模式之 代理模式
- 设计模式-代理模式
- java设计模式之——代理模式
- 设计模式之代理模式
- 【设计模式】【六】代理模式
- C# 设计模式之 代理模式
- 设计模式--代理模式
- 【设计模式】动态代理Proxy_03
- 设计模式之代理模式
- 【设计模式】代理模式Proxy---动态代理
- 设计模式——代理模式
- 设计模式读书笔记-----代理模式