设计模式之代理模式

来源:互联网 发布:java登陆功能实现 编辑:程序博客网 时间:2024/06/08 13:59

1.概念

   代理模式就是为对象提供一种代理以控制对这个对象的访问。简而言之,就是用一个对象来代替另外一个对象来控制该对象的访问权限。

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;}@Overridepublic void operatorA() {System.out.println(girl.getName()+"收到了玫瑰!");}@Overridepublic void operatorB() {System.out.println(girl.getName()+"收到了巧克力!");}@Overridepublic 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);}@Overridepublic void operatorA() {subject.operatorA();}@Overridepublic void operatorB() {subject.operatorB();}@Overridepublic 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的动态代理类来解决。动态代理可以让系统能够根据实际需要来动态创建代理类,让同一个代理类能够代理多个不同的真实主题类而且可以代理不同的方法。

原创粉丝点击