博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式总结篇系列:代理模式(Proxy)
阅读量:6168 次
发布时间:2019-06-21

本文共 1915 字,大约阅读时间需要 6 分钟。

时代在发展,我们发现,现在不少明星都开始进行微访谈之类的,有越来越多的参与捐赠等。新的一天开始了,首先看下新的一天的日程安排:

复制代码
1 interface Schedule{2     3     public void weiTalk();4     5     public void donation();6     7 }
复制代码

Schedule接口定义了今天的形成安排,主要包括微访谈和捐款。那么看一下实现此接口的明星类定义:

复制代码
1 class Star implements Schedule { 2  3     @Override 4     public void weiTalk() { 5         System.out.println("开始微访谈"); 6     } 7  8     @Override 9     public void donation() {10         System.out.println("开始捐款");11     }12 13 }
复制代码

我们知道,现在明星一般的身边都有一个人,称之为经纪人,负责明星的工作安排及各种事物处理等。一般明星到哪,相应的经纪人也就到哪。我们来定义一个经纪人:

复制代码
1 class Broker implements Schedule { 2     private Schedule star; 3  4     public Broker() { 5         star = new Star(); 6     } 7  8     public Broker(Schedule star) { 9         this.star = star;10     }11 12     @Override13     public void weiTalk() {14         System.out.println("陪着明星参加为访谈");15         star.weiTalk();16     }17 18     @Override19     public void donation() {20         System.out.println("陪着明星捐款");21         star.donation();22     }23 24 }
复制代码

我们知道,Broker虽然也需要参加微访谈和捐款,但都是陪着明星的,例如现在正在微博访谈,网友问了一个问题:你希望你的小neinei尽快长大呢?WZ回答,当然不是很希望啦。于是经纪人在WZ的微博中回复网友:当然不是很希望啦。

我们发现,Broker对象实现的方法中实际上调用的还是相应所持有的Star对象引用中相应的方法。好,假如正在微访谈过程中,小neinei睡醒了,嚷嚷着爸爸去哪了,于是WZ只得马上跑过去哄自己心爱的小neinei。可这时候网友们还在提问啊,怎么办呢,经纪人总不能擅自做主张的直接回答网友问题吧,于是向网友解释:小neinei醒了,WZ去哄她睡觉了,微访谈顺延到21:30。

又或者在去参与捐赠会的路上,突然剧组那边有更重要的发布会要Star过去,这时候捐赠会主办方打电话过来询问代理们是不是快要到了,代理当即回答,Star临时有更重要的事情要处理,就不去参加了,当然,钱肯定还是会给的。

在外界看来,一般情况下无论是接商务广告还是友情出演,首先都是联系Broker的,等Broker和Star商量后作出决定并有Broker对外回复。

上面整个过程中,外界与Star是不能直接接触的,或者说要先有代理的安排,Broker和Star之间的关系是代理和被代理的关系。这种设计模式我们称之为代理模式。可能有人会说,怎么感觉跟装饰器模式那么像呢?确实,在代码层次而言,两者确实比较接近。而主要的不同在于两个模式背后所蕴含的思想:

装饰器模式主要用来替代继承,为的是给一个现有的类增加新的功能,客户端关心的是装饰后的类所具有的功能;而代理模式为的是对被代理对象提供访问控制,客户端关心的实际上还是被代理对象所具有的功能。

 

---------------------------------------------------------------------------------
笔者水平有限,若有错漏,欢迎指正,如果转载以及CV操作,请务必注明出处,谢谢!
分类:
本文转自Windstep博客园博客,原文链接:http://www.cnblogs.com/lwbqqyumidi/p/3751345.html,如需转载请自行联系原作者
你可能感兴趣的文章
Laravel 5.2数据库--迁移migration
查看>>
ExtJs Extender controls 不错的例子
查看>>
html的基础知识
查看>>
Mybatis Sql片段的应用
查看>>
突发奇想20150126
查看>>
Nginx + CGI/FastCGI + C/Cpp
查看>>
学习笔记------jsp页面与jsp标记
查看>>
DS博客作业02--线性表
查看>>
第三届ACM山东省赛I题_Chess_STL
查看>>
jQuery each和js forEach用法比较
查看>>
前端笔记-作用域链的一些理解加记录(JS高级程序设计读书笔记1)
查看>>
『参考』.net CF组件编程(1)——基础之后
查看>>
asp.net真的是并行处理request的吗?
查看>>
structured sparsity model
查看>>
AIM(Autodesk Infrastructure Modeler) 的API示例--列出选中对象
查看>>
WMI使用集锦
查看>>
分析代码的利器 - ctags
查看>>
JavaScript数据结构与算法——链表
查看>>
【Leetcode】98. 验证二叉搜索树
查看>>
改造你的网站,变身 PWA
查看>>