大话设计模式读书笔记系列-4.代理模式
>>>大话设计模式读书笔记系列目录>>>
代理模式
为其他对象提供一种代理以控制这个对象的访问.
场景:
通过"屌丝男士"委托"金牌代理"给校花"杨幂"送礼物的场景来了解代理模式
被追求者(校花)
/** * 被追求者(校花) */ public class SchoolGirl { /** * 芳名 */ private String name; public SchoolGirl(String name) { this.name=name; } /** * 获取 芳名 * * @return name 芳名 */ public String getName() { return this.name; } /** * 设置 芳名 * * @param name 芳名 */ public void setName(String name) { this.name = name; } }
送礼物接口
/** * 送礼物接口 */ public interface GiveGift { /** * 送洋娃娃 */ void giveDolls(); /** * 送花 */ void giveFlowers(); /** * 送巧克力 */ void giveChocolate(); }
追求者类
/** * 追求者类 */ public class Pursuit implements GiveGift { /** * 名字 */ private String name; /** * 心仪的校花MM */ SchoolGirl schoolGirl; public Pursuit(String name) { this.name = name; } /** * 喜欢上一个MM * * @param schoolGirl */ public void like(SchoolGirl schoolGirl) { this.schoolGirl = schoolGirl; } @Override public void giveDolls() { if (this.schoolGirl == null) { return; } System.out.println(this.name + " 送洋娃娃给 " + this.schoolGirl.getName()); } @Override public void giveFlowers() { if (this.schoolGirl == null) { return; } System.out.println(this.name + " 送鲜花给 " + this.schoolGirl.getName()); } @Override public void giveChocolate() { if (this.schoolGirl == null) { return; } System.out.println(this.name + " 送巧克力给 " + this.schoolGirl.getName()); } }
职业代理人
/** * 职业代理人 */ public class ProxyMan implements GiveGift { /** * 委托人 */ private Pursuit pursuit; /** * 构造代理人 * @param pursuit * @param schoolGirl */ public ProxyMan(Pursuit pursuit, SchoolGirl schoolGirl) { //委托人 this.pursuit = pursuit; //心仪女神 this.pursuit.like(schoolGirl); } @Override public void giveDolls() { this.pursuit.giveDolls(); } @Override public void giveFlowers() { this.pursuit.giveFlowers(); } @Override public void giveChocolate() { this.pursuit.giveChocolate(); } }
调用
public class ProxyDemo { public static void main(String[] args) { //校花杨幂 SchoolGirl schoolGirl=new SchoolGirl("杨幂"); //委托人 Pursuit pursuit=new Pursuit("屌丝男士"); //金牌代理人,接受 屌丝男士 追求 杨幂 任务 ProxyMan proxyMan=new ProxyMan(pursuit,schoolGirl); //洋娃娃腐化 proxyMan.giveDolls(); //鲜花腐化 proxyMan.giveFlowers(); //巧克力腐化 proxyMan.giveChocolate(); } }
结果
屌丝男士 送洋娃娃给 杨幂
屌丝男士 送鲜花给 杨幂
屌丝男士 送巧克力给 杨幂
解析
1.远程代理,也就是为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实.
2.虚拟代理,是根据需要创建开销很大的对象,通过他来存放实例化需要很长时间的真实对象.
3.安全代理,用来控制真实对象访问时的权限.
4.智能指引,是指当调用真实的对象时,代理处理另外一些事.