`
Damon_Zhang
  • 浏览: 71861 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java设计模式之为别人做嫁衣----代理模式

阅读更多

推荐两个微信公众账号:并发编程网、快乐编程

摘要:感受设计演变过程中所蕴含的大智慧,体会乐与怒的程序人生中值得回味的一幕幕。本文转自大话设计模式第七章之代理模式!

本文转载于:http://blog.csdn.net/monkey_d_meng/article/details/5689877

7.1为别人做嫁衣

“小菜,今天见这个叫娇娇的美女见得如何呀?”大鸟一回家来就问小菜。

“唉,别提了,人家是有男朋友的。”小菜无精打采地答道。

“有男朋友了啊,这倒是我没料到,那为什么还找你帮忙修电脑?”

“她男友叫戴励,在北京读大学呢,他们高中就开始谈恋爱了。”小菜说,“而且她还告诉了我一件比较有趣的事。”

“哦,是什么?”

“是这样的,我们在吃饭的时候,我就问她,怎么不找男友帮修电脑。她说男友在北京读书,所以没办法帮助修。我心里一想,‘你在上海怎么男友会在北京’,正想问他们是怎么认识的,她却接着问我想不想知道他男友追她的事。哈,这不正是我所希望的吗,于是我就跟着她开始了美好的回忆。”

“又不是你谈恋爱,说得这么肉麻,还‘美好的回忆’。她回忆什么了?”

“当时她是这么说的:‘那是在我高中二年级时的一天下午……’”

“娇娇同学,这是有人送你的礼物。”一个男生手拿着一个芭比娃娃送到她的面前。

“戴励同学.这是什么意思?”娇娇望着同班的这个男生,感觉很奇怪。

“是这样的,我的好朋友,隔壁三班的卓贾易同学,请我代他送你这个礼物的。”戴励有些脸红。

“为什么要送我礼物,我不认识他呀。”

“他说……他说……他说想和你交个朋友。”戴励脸更红了,右手抓后脑勺,说话吞吞吐吐。

“不用这样,我不需要礼物的。”娇娇显然想拒绝,

“别别别,他是我最好的朋友,他请我代他送礼物给你,也是下了很大决心的,你看在我之前时常帮你辅导数学习题的面子上,就接受一下吧。”戴励有些着急。

“那好吧,今天我对解析几何的椭圆那里还是不太憧,你再给我讲讲。”娇娇提出条件后接过礼物。

“没问题,我们到教室去讲吧。”戴励松了口气。

几天后

“娇娇,这是卓贾易送你的花。”

“娇娇,这是卓贾易送你的巧克力。”

“我不要他送的东西了,我也不想和他交朋友。我愿意……我愿意和你做朋友!”娇娇终于忍不住了,

直接表白。

“啊,……我不是在做梦吧……”戴励喜从天降,不敢相信。

“呆子!”娇娇微笑地骂道。

戴励用手抓了抓头发说,“其实我也喜欢你。不过,……不过,那我该如何向卓贾易交待昵?”

从此戴励和娇娇开始恋爱了。毕业后,戴励考上了北京XX大学,而娇娇读了上海的大专。

“喂,醒醒,还在陶醉呀。这个戴励根本就是一个大骗子,哪有什么卓贾易,这是他自己想泡MM找的借口。”大鸟不屑一顾。

“我当时也是这么想的,但她说是真的有这个人,后来那个卓贾易气死了,差点和戴励翻脸。”小菜肯定地说。

“那就不能怪戴励了,卓贾易就是为别人在做嫁衣,所以自己苦恼也是活该,谁叫他不自己主动,找人代理谈恋爱,神经病呀,”

“是呀,都怪他自己。为别人做嫁衣的滋味不好受哦。”

“这里又可以谈到一个设计模式了。”

“你不说我也知道是哪一个,代理模式对吧?”

“哈,说得没错。小菜真是越来越聪明。”

“去去去,口是心非的东西,代理模式又是怎么讲的?”

“你先试着写如果卓贾易直接追娇娇,应该如何做?”

7.2没有代理的代码
十分钟后,小菜写出了第一份代码。

结构图

//被追求者类  
public class SchoolGirl  
{  
    public String   name;  
  
    public String getName()  
    {  
        return this.name;  
    }  
  
    public void setName(String name)  
    {  
        this.name = name;  
    }  
}  
//追求者类  
public class Pursuit  
{  
    SchoolGirl  mm;  
  
    public Pursuit(SchoolGirl mm)  
    {  
        this.mm = mm;  
    }  
  
    public void giveDolls()  
    {  
        System.out.println(mm.name + " 送你洋娃娃");  
    }  
  
    public void giveFlowers()  
    {  
        System.out.println(mm.name + " 送你鲜花");  
    }  
  
    public void giveChocolate()  
    {  
        System.out.println(mm.name + " 送你巧克力");  
    }  
}  
//客户端代码  
public class Main  
{  
    public static void main(String[] args)  
    {  
        SchoolGirl jiaojiao = new SchoolGirl();  
        jiaojiao.setName("李娇娇");  
  
        Pursuit zhuojiayi = new Pursuit(jiaojiao);  
  
        zhuojiayi.giveDolls();  
        zhuojiayi.giveFlowers();  
        zhuojiayi.giveChocolate();  
    }  
}  

 

“我了个擦,娇娇并不认识卓贾易,这样写的话不就等于卓贾易自己去送东西了嘛。”
“是哇,这如何处理来着?”
“而且,你丫把戴励给弄哪去了?”
“哈,对的对的,戴励就是代理啊。”
7.3只有代理的代码

十分钟后。
结构图

 

//被追求者类  
public class SchoolGirl  
{  
    public String   name;  
  
    public String getName()  
    {  
        return this.name;  
    }  
  
    public void setName(String name)  
    {  
        this.name = name;  
    }  
}  
//代理类  
public class Proxy  
{  
    SchoolGirl  mm;  
  
    public Proxy(SchoolGirl mm)  
    {  
        this.mm = mm;  
    }  
  
    public void giveDolls()  
    {  
        System.out.println(mm.name + " 送你洋娃娃");  
    }  
  
    public void giveFlowers()  
    {  
        System.out.println(mm.name + " 送你鲜花");  
    }  
  
    public void giveChocolate()  
    {  
        System.out.println(mm.name + " 送你巧克力");  
    }  
}  
//客户端代码  
public class Main  
{  
    public static void main(String[] args)  
    {  
        SchoolGirl jiaojiao = new SchoolGirl();  
        jiaojiao.setName("李娇娇");  
  
        Proxy daili = new Proxy(jiaojiao);  
  
        daili.giveDolls();  
        daili.giveFlowers();  
        daili.giveChocolate();  
    }  
}  

“我了个擦,你丫写的是个啥?”
“这又有什么问题,为什么出错的总是我。”
“你把Pursuit(追求者)换成了Proxy(代理),把卓贾易换成戴励。这就使得这个礼物变成是戴励送的,而你刚才还肯定地说,卓贾易这个人是存在的,礼物是他买的,你这怎么能正确呢?”
“哦,我明白了,我这样写把Pursuit追求者给忽略了,事实上应该Pursuit追求者通过Proxy代理送给SchoolGirl被追求者礼物,这才是合理的。那我应该如何办呢? SchoolGirl被追求者送的礼物是Pursuit追求者买的,实质是还是追求者Pursuit送的,只是通过Proxy代理了。”
“很好,既然两者都有相同的方法,那就意味着他们都怎样?”
“哦,你的意思是他们都实现了同样的接口?我想,我可以写出代码来了。”
“小菜开窍了。”
7.4符合实际的代码

十分钟后。小菜第三份代码。
结构图

//代理接口  
public interface GiveGift  
{  
    void giveDolls();  
  
    void giveFlowers();  
  
    void giveChocolate();  
}  
//追求者类  
public class Pursuit implements GiveGift  
{  
    SchoolGirl  mm;  
  
    public Pursuit(SchoolGirl mm)  
    {  
        this.mm = mm;  
    }  
  
    public void giveDolls()  
    {  
        System.out.println(mm.name + " 送你洋娃娃");  
    }  
  
    public void giveFlowers()  
    {  
        System.out.println(mm.name + " 送你鲜花");  
    }  
  
    public void giveChocolate()  
    {  
        System.out.println(mm.name + " 送你巧克力");  
    }  
}  
//代理类  
public class Proxy implements GiveGift  
{  
    Pursuit gg;  
  
    public Proxy(SchoolGirl mm)  
    {  
        gg = new Pursuit(mm);  
    }  
  
    public void giveChocolate()  
    {  
        gg.giveChocolate();  
    }  
  
    public void giveDolls()  
    {  
        gg.giveDolls();  
    }  
  
    public void giveFlowers()  
    {  
        gg.giveFlowers();  
    }  
}  
//客户端代码  
public class Main  
{  
    public static void main(String[] args)  
    {  
        SchoolGirl jiaojiao = new SchoolGirl();  
        jiaojiao.setName("李娇娇");  
  
        Proxy daili = new Proxy(jiaojiao);  
        daili.giveDolls();  
        daili.giveFlowers();  
        daili.giveChocolate();  
    }  
}  

 

“这下好了,娇娇不认识追求她的人,但却可以通过代理人得到礼物。效果也达到了。”
“这就是代理模式。好了,我们来看看GoF对代理模式是如何描述的。”
7.5代理模式

代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问。
代理模式(Proxy)结构图

//Subject类,定义了RealSubject和Proxy的共用接口,这样就在任何使用RealSubject的地方都可以使用Proxy。  
public interface Subject  
{  
    public void request();  
}  
//RealSubject类,定义Proxy所代表的真实实体。  
public class RealSubject implements Subject  
{  
    public void request()  
    {  
        System.out.println("真实的请求");  
    }  
}  
//Proxy类,保存一个引用使用代理可以访问实体,并提供一个与Subject的接口相同的接口,这样的代理可以用替代实体。  
public class Proxy implements Subject  
{  
    RealSubject realSubject;  
  
    public void request()  
    {  
        if (null == realSubject)  
        {  
            realSubject = new RealSubject();  
        }  
        realSubject.request();  
    }  
}  
//客户端代码  
public class Main  
{  
    public static void main(String[] args)  
    {  
        Proxy proxy = new Proxy();  
        proxy.request();  
    }  
}  

7.6代理模式应用

“那代理模式一般应用于什么场合呢?”
“一般来说可以分为以下几种:第一,远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。”
“这么抽象的说,你能不能举个具体点的例子说明一下。”
“其实你一定用过的,WebService在.NET中的应用是怎样做的?”
“哦,我明白什么叫远程代理了,当我在应用程序的项目中加入一个Web引用,引用一个WebService,此时会在项目中生成一个WebReference的文件夹和一些文件,其实它们就是代理,这就使得客户端程序调用代理就可以解决远程访问的问题。原来这就是代理模式的应用啊。”
“第二种应用是虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。这样就可以达到性能的最优化,比如说你打开一个很大的HTML网页时,里面可能有很多的文字和图片,但你还是可以很快地打开它,此时你所看到的所有文字,但图片却是一张一张地下载后,才能看到的。那些未打开的图片框,就是通过虚拟代理来替代了真实的图片,此时代理存储了真实图片的路径和尺寸。”
“哦,原来浏览器当中是用代理模式来优化下载的啊。”
“第三种应用是安全代理,用来控制真实对象访问时的权限。一般用于对象应该有不同的访问权限的时候。第四种是智能指引,是指当调用真实对象时,代理处理另外一些事。如计算真实对象的引用次数,这样当该对象没有引用时,可以自动释放它;或当第一次引用一个持久对象时,将它装入内存;或在访问一个实际对象前,检查是否已经锁定它,以确保其他对象不能改变它。它们都是通过代理在访问一个对象时附加一些内务处理。”
“啊,原来代理可以做这么多的事情啊,我还以为它是一个很不常用的模式呢。”
“代理模式其实就是在访问对象时引入一定程度的间接性,因为这种间接性,可以附加多种用途。”
“哦,明白,说白了,代理就是真实对象的代表。”
7.7秀才让小六代其求婚

“好了,看会儿电视吧,好几天没看《武林外传》了。”大鸟打开了电视,此时武林外传正在播放第22集。
当播放到最后片段时,剧中,郭芙蓉对吕秀才恶狠狠地说:“吕秀才,是你让小六向我求婚的吧?”
“造物弄人!”吕秀才惨惨地答道,“这只是一个玩笑。”
“哦! ……玩笑!”郭芙蓉冷笑地说,“我杀了你!”
秀才速奔出去,郭芙蓉口中叫着“你给我站住!”跟着跑了出去……
小菜和大鸟看到这里,转头相互看着对方,小菜说:“吕秀才让燕小六代其向郭芙蓉求婚,这不就是…”,两人异口同声的说:“代一理一模一式!”

3
4
分享到:
评论

相关推荐

    04_ProxyPattern 为别人做嫁衣

    代理模式(Proxy Pattern)是设计模式中的结构型模式之一,其主要目的是为其他对象提供一个代理以控制对这个对象的访问。在“为别人做嫁衣”的比喻中,这里的“别人”即目标对象,而“嫁衣”则代表了代理对象,它为...

    率叶 - 花瓣的嫁衣-crx插件

    花瓣网,一个设计师不得不上的网站,此扩展大大可改善花瓣网用户体验:1、直接打开大图和下载大图;2、直接打开来源网站,瞬间变成一个网址导航;3、可以全屏幻灯片预览,当然远远不止这些。。。 插件简介:率叶插件...

    025-美丽的嫁衣.rar

    这些字体可以被导入到各种设计软件中,为设计添加个性化的文字元素。 色彩方案(如ASE或ACO文件)是预设的颜色组合,可以帮助设计师快速建立和谐统一的视觉效果。而PPT或KEY文件可能包含预先设计好的演示模板,方便...

    “时尚嫁衣”婚纱网站前端设计与实现毕业设计.pdf

    “时尚嫁衣”婚纱网站前端设计与实现毕业设计 在当今时代,互联网的发展日益迅速,企业网站建设也随之而兴起。随着企业网站的普及,企业能够更好地扩大知名度,提升品牌形象。因此,本毕业设计的主要内容是“时尚...

    《自己的嫁衣》读后感.doc

    书名《自己的嫁衣》源自秦韬玉的诗句,章老以此自喻,表示自己一生为他人做嫁衣,即为文学事业默默付出。书中还插入了章老与众多文化名人和家人的珍贵合影,每一张照片背后都有其故事,为读者呈现了一个更为立体的章...

    Delphi SQLite Wrapper 2.1.2(2012-08-21)

    或许是“A simple Delphi wrapper for Sqlite3”太著名了或许不想背后默默的贡献代码给别人做嫁衣,最终在“A simple Delphi wrapper for Sqlite3”基础上,自已进行了改造、优化,去掉了许多重复的功能,变成了一个...

    【精品文档-管理学】试析我国中小型民营企业人力资源开发与管理.docx

    - **漠视人力资本投入**:许多企业主持有功利主义观点,担心人才培养会为他人做嫁衣,因此不愿意投资于员工培训和发展,这不仅限制了员工的成长空间,还可能加速人才流失。 - **家族管理模式难以摆脱**:尽管很多...

    【精品文档-管理学】浅析民营企业员工培训的误区与对策_人力资.docx

    - 认为培训是“为别人做嫁衣”:民营企业担心员工受训后跳槽,导致企业失去投资回报。然而,高质量的培训能提高员工忠诚度,吸引优秀人才。 - 将培训视为员工“福利”:企业应视培训为投资而非成本,长期来看,...

    通用版2021新高考语文一轮复习专项对点练42语言表达得体__老题型有可能披上“新嫁衣”

    - "绵薄之力"改为"指导帮助","绵薄之力"是谦词,用于自己,不适合用于别人。 - "佼佼者"改为"爱好者","佼佼者"形容非常优秀的人,对于学生来说过于自夸,"爱好者"更合适。 - "编安"改为"安康","编安"是给编辑...

    房地产广告语,只是一件嫁衣?.doc

    广告语如同一件嫁衣,精心设计用来吸引购房者的注意力,促进项目的销售。本文将深入探讨广告语在房地产营销中的地位和作用。 首先,广告语与案名的关系并非简单的附属,而是相辅相成的。案名通常由开发商在项目初期...

    个性嫁衣店

    【个性嫁衣店】是一个独特的业务模式,它在婚礼行业中占据了一席之地,为新人们提供定制化的婚纱礼服服务。这份文档详细介绍了如何经营一家个性化的嫁衣店,包括但不限于设计概念、市场定位、服务流程、营销策略等多...

    企业级培训体系的建立

    3. **视培训为“为人作嫁衣”**:即担心培训后员工会跳槽到竞争对手那里,忽略了培训对于增强员工忠诚度的作用。 4. **忽视培训的重要性**:认为培训耗时、费钱、费力,不如将精力集中在招聘和“挖人”上。 5. **将...

    UGC社区电商面临的问题及对策研究——以小红书为例.pdf

    3. 口碑饱受诟病,为他人做嫁衣:小红书在电商方面的劣势导致用户可能参考笔记却在其他平台购买产品,社区的流量并未有效转化为购买力。 4. 广告推广与用户体验之间的矛盾:为了商业化变现,小红书引入了大量明星、...

    4月海外经销商的开发与管理暨海外客户关系管理(DOC9页).doc

    网络布局应兼顾中间市场和终端市场,同时防止过度依赖某一经销商,以防“为他人做嫁衣”。管理上可采用ABC分类法,根据业绩和重要性进行区分,并实施动态管理,确保业绩增长和风险控制。 外销人员的角色是管理、...

    网络营销之博客推广操作教程.pptx

    同时,避免在文章中出现其他同行的广告信息,以免为他人做嫁衣。 **四、关键词选择与优化** 1. **关键词推荐** - 可以利用百度关键词推荐工具来寻找合适的关键词。 2. **关键词列表** - 维护一个关键词列表有助于...

    2021-2022收藏资料民营企业员工培训.doc

    【民营企业员工培训】 民营企业在构建有效的员工培训体系时...同时,企业需要建立合理的激励机制,留住人才,防止因培训投资而为他人做嫁衣。通过持续改进和创新,民营企业能够在人才竞争中脱颖而出,实现可持续发展。

    不看不知道,直播还可以这么玩?!

    首先,乐直播帮助企业构建自己的直播阵地,避免在第三方平台上为他人做嫁衣,通过SaaS、PaaS系统平台支持,企业可在微信生态系统内进行直播,减少开发成本,利用社交网络进行传播,提高精准营销的效果。 其次,乐...

    2020_2021学年高考语文一轮复习专项对点练39语言表达得体__老题型有可能披上“新嫁衣”含解析新人教版

    语言表达应符合特定的语境,例如,自荐信中不宜使用过于自夸的词汇,"好几次学年第一"可以改为"多次荣登学年榜首","骄人成绩"改为"第四名的成绩","慧眼识金"改为"给我一个机会","莅临"改为"到","绵薄之力"改为...

    张韶涵——不玩性感,不动风情,扯几寸清纯作嫁衣

    1. 张韶涵的个人资料:张韶涵是一位台湾歌手,英文名为Angela,1982年1月19日出生于中国台湾,属狗,身高158厘米,体重39公斤,血型A,星座摩羯座。她的出道作品包括写真集《奇迹安琪拉》。 2. 娱乐圈经历:张韶涵...

Global site tag (gtag.js) - Google Analytics