设计模式学习笔记——代理模式

来源:互联网 发布:陕甘回乱 左中堂知乎 编辑:程序博客网 时间:2024/06/06 02:09

代理模式

代理模式定义:为其他对象提供一种代理以控制对这个对象的访问。

结构图


Subject:定义了RealSubject和Proxy的共用接口,可以实现任何使用RealSubject的地方都可以使用Proxy
RealSubject:定义Proxy所代表的真实实体。
Proxy:保存一个引用使得代理可以访问实体,并提供一个与Subject的接口相同的接口,代替实体。

代码实现

Subject类:
/** * 定义RealSubject和Proxy的共用接口 * @author xukai * 2016年3月8日 下午9:59:27 */public abstract class Subject {public abstract void request();}
RealSubject类:
/** * Proxy所代表的真实实体 * @author xukai * 2016年3月8日 下午10:00:47 */public class RealSubject extends Subject {@Overridepublic void request() {System.out.println("真实的请求");}}
Proxy类:
/** * 代理类 * @author xukai * 2016年3月8日 下午10:02:18 */public class Proxy extends Subject {RealSubject realSubject;@Overridepublic void request() {if(realSubject == null){realSubject = new RealSubject();}realSubject.request();}}
客户端:
public class ProxyClient {public static void main(String[] args) {Proxy proxy = new Proxy();proxy.request();}}
控制台输出:

流程分析:通过代理类的request方法调用RealSubject的request方法。

DEMO

问题:使用代理模式实现功能,追求者对被追求者送礼物,通过代理者实现此功能。

接口GiveGift:
/** * 定义动作接口,追求者和代理者都具有的动作 * @author hcc */public interface GiveGift {public void giveDolls();public void giverFlowers();public void giveChocolate();}
追求者Pursuit类:
/** * 追求者,动作的发出者。 * 被追求的人并不认识追求者 * @author hcc * */public class Pursuit implements GiveGift {SchoolGirl mm;public Pursuit(SchoolGirl mm) {this.mm = mm;}@Overridepublic void giveDolls() {System.out.println("送洋娃娃");}@Overridepublic void giverFlowers() {System.out.println("送花");}@Overridepublic void giveChocolate() {System.out.println("送巧克力");}}
代理者ProxyPursuit类:
/** * 代理者:代替追求者执行动作 * @author hcc * */public class ProxyPursuit implements GiveGift {Pursuit gg;public ProxyPursuit(SchoolGirl mm) {gg = new Pursuit(mm);}@Overridepublic void giveDolls() {gg.giveDolls();}@Overridepublic void giverFlowers() {gg.giverFlowers();}@Overridepublic void giveChocolate() {gg.giveChocolate();}}
客户端测试:
public class ProxyTest {public static void main(String[] args) {SchoolGirl mm = new SchoolGirl();mm.setName("漂亮妹子");ProxyPursuit proxy = new ProxyPursuit(mm);proxy.giveDolls();proxy.giveChocolate();proxy.giverFlowers();}}
输出结果:
*注:被追求者不知道追求者的存在,代理者认识被追求者,同样认识追求者。

总结

代理模式应用


1.远程代理:为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不容地址空间的事实


2.虚拟代理:根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。(浏览器加载图片)


3.安全代理:用来控制真实对象访问时的权限。


4.智能指引,指当调用真实的对象时,代理处理另外一些事。







1 0
原创粉丝点击