标签:zha ret todo ati 动态代理模式 rac ges 模式 ons
静态代理模式,为其他对象提供一种代理来控制对这个对象的访问。
代理,顾名思义,就好比如明星的经纪人可以代理他处理一些业务上的事情,再比如你领取快递,几乎都是通过一些代理点领取,应该没人到总部领取吧。
UML:
共用的接口(Subject):RealSubject和Proxy的共用接口
RealSubject: 定义了Proxy所代表的真实实体
Proxy类:保存一个RealSubject引用使得代理可以访问实体,并提供一个与RealSubject的接口相同的接口,来代理实体
例子:王五(RealSubject)让保姆(Proxy)代理自己赵六超市(Supermarket)去买个西瓜(IBuyWatermelon)
Supermarket
package com.magggie.proxy; public class Supermarket { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public Supermarket(String name) { super(); this.name = name; } public Supermarket() { super(); } }
IBuyWatermelon():共用的接口
package com.magggie.proxy; public interface IBuyWatermelon { //代理事件 public abstract void buyWatermelon(); }
RealSubjec():被代理者
package com.magggie.proxy; public class RealSubject implements IBuyWatermelon{ private Supermarket supermaket; public RealSubject(Supermarket supermaket) { super(); this.supermaket = supermaket; } public RealSubject() { super(); // TODO Auto-generated constructor stub } @Override public void buyWatermelon() { System.out.println("在"+supermaket.getName()+" 买西瓜"); } }
Proxy:代理者
package com.magggie.proxy; public class Proxy implements IBuyWatermelon{ RealSubject wangWu;//持有RealSubject的引用 // 在构造函数时new出RealSubject public Proxy(Supermarket supermarket) { wangWu = new RealSubject(supermarket); } @Override public void buyWatermelon() { //在方法里调用realsubject的方法 wangWu.buyWatermelon(); } }
Client调用
package com.magggie.proxy; public class Client { public static void main(String[] args) { Supermarket zhaoLiu = new Supermarket(); zhaoLiu.setName("赵六超市"); Proxy hourseKeeper = new Proxy(zhaoLiu); //从代理模式可以看出,在客户端只调用Proxy,并没有出现RealSubject hourseKeeper.buyWatermelon(); } }
输出
在赵六超市 买西瓜
代理模式使得隐藏了RealSubject,有起到安全的作用,实际上有安全代理,用来控制真实对象访问时的权限,还有远程代理,虚拟代理,智能指引等。
但是现在的静态代理模式遇到多个代理类时,同时代理事件的接口要添加或减少方法时,就要同时去更改多个地方的代码,这就跟开放-封闭原则违背了。。
因此动态代理模式出现了。。。。
标签:zha ret todo ati 动态代理模式 rac ges 模式 ons
原文地址:http://www.cnblogs.com/maggiejyt/p/7568306.html