设计模式之我爱我家[转贴]

模式无处不在,这里讲述的是happy一家的故事:Happyfather,HappyMother还有HappySOn .

行为模式:

CHAIN OF RESPONSIBILITY---职责链

定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系

使用频率:

使用情景:

HappySon:“老妈 这个题不会做了帮帮我”

HappyMother:“要先这样然后在这样就行了”

HappySon:“老妈 这个又不会了”

HappyMother:“这个我也不会,问你老爸去吧”

HappyFather:“这么简单呀,你们俩去看电视吧,我做完了以后给你”

情景解释:HappyFathe HappyMother都有辅导HappySon功课的职责

 

COMMAND----命令

定义:将一个请求封装为一个对象,从而是你可以用不同的请求对客户进行参数话,对请求排队和记录请求日志,以及支持可撤销的操作

使用频率:

使用情景:

HappyFather :“KFC 吗?我要一大瓶可乐,我老婆要一中瓶可乐,我儿子要一小瓶可以 还要一个外卖桶”

半个小时后

HappyFather:“我这个大瓶可以可以不要吗”

KFC送货员:“对不起先生,你预定的就要付钱呀”

HappyFather:“可是Command 模式支持可撤销操作呀”

KFC送货员:“对不起先生,我只是个送外卖的”

情景解释:定餐就是Command 模式

 

INTERPRETER---解释器

定义:给定一个语言,定义他的文法的一个表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子

使用频率:

使用情景:

19××年某天,HappySon 九个月大

Happyson:“哇….哇”

HappyMother :“孩他爸快那尿布来”

HappySon:“哇哇….哇”

HappyMother:“老公,快拿奶粉来,儿子饿了”

HappySon:“嘻…..嘿嘿”

HappyMother:“亲爱的,儿子饭后要看你表演!”

情景解释:happyson的语言 只能由 HappyMother 解释给HappyFather

 

ITERATOR---迭代器

定义:提供一个方法顺序访问一个聚合对象的各个元素,而又不需要暴露该对象的内部表示

使用频率:  

使用情景:

HappyFather :“快播,琼窑的连续剧都是无病呻吟”

HappyFather :“快播,中国足球比我的脚都臭”

HappyFather:“跳过中央九台 ,全是鸟语听不懂”

HappyFather:“就看这台吧 ,养眼”

HappyMother 上来爆K HappyFather一顿,原来HappyFather 要看的是模特大赛

情景解释:所有的电视台就是一个集合

 

MEDIATOR---中介者

定义:用一个中介对象封装一些列的对象交互

使用频率:

使用情景:

工作调动关系,Happy一家临时搬到了××市,因为××市的人特别不好相处,所以Happyfather 通过房屋中介所租房子:房租资金,配套设施只需和中介所交涉,然后中介所再和房东协商,这样就避免了和房东的联系

情景解释:中介所起到了中介的作用

友情提示:很多中介所都是骗人的

MEMENTO—备忘录

定义:在不破坏对象的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态

使用频率

使用情景:

HappyMother:“不是让你去刷马桶吗?你在干吗?”

HappyFather:“今天是咱们结婚纪念日,我在看那天的录像”

HappyMother:“算你有良心还记得这个日子”

情景解释:结婚录像就是备忘录

友情提示:不能忘的三个日子:老婆的生日,结婚纪念日,情人节

 

OBSERVER---观察者

定义:定义对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知自动更新

使用频率:  

使用情景:

美国进攻伊拉克,HappyFather 每天读报了解最新消息,HappyMother 每天看电视获得最新消息,HappySon每天上网浏览最新消息,战况变化,一家人通过不同的对象获取最新消息

情景解释:报纸、电视、网络的新闻都是依赖于伊拉克战况的

 

STATE---状态

定义:允许对象在其内部状态改变时改变他的行为。对象看起来似乎改变了他的类

使用频率:
使用情景:

HappyFather 工作劳累病倒了

HappyMother:“老公,快起来吃药”

HappyMother:“老公,起来吃点水果”

HappyMother::“老公,不要作家务,快去休息”

嘿嘿,这么舒服,HappyFather 病好了还想在床上赖两天

HappyMoterh :“你怎么还不起来收拾房间?”

HappyFather :“我 病还没有好”

HappyMother:“装!往死里装”

HappyFather :“得不得病态度差这么多呀”

情景解释:得病和病好了两种状态

 

STRATEGY---策略模式

定义:定义一系列的算法,把他们一个个封装起来,并使他们可以互相替换,本模式使得算法可以独立于使用它们的客户

使用频率:

使用情景:

小王两年前借HappyFather的钱至今未还,正好这天小王来Happy 家做客(正是要帐的好机会)。

首先旁敲侧击法

HappyFather:“前两天我见到咱们的老同学小李了,他还了我1000元钱,说是两年前借的,他要是不还呀,我都忘了”

小王:“是呀,小李的记性就是好,比我强多了”

居然没奏效,下一招诱蛇出洞

HappyFather:“听说你最近生意不错呀,怎么样成本都收回来了嘛?债务都还上了吗?

小王:“还算红火,债务基本上还清了”

看来只能单刀直入了

HappyFather:“那你借我的2000元也该还了吧!”

情景解释:针对向小王要帐这个事情,HappyFather 采用了三个办法,办法之间可以相互替换,这些方法对谁都有作用的。

 

TEMPLATE METHOD---模板方法

模式定义:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,TemplateMethod 使

得子类可以不改变一个算法得结构即可以重定义该算法得某些特定步骤。

使用频率:

使用情景:

HappyMother 递给HappyFather  一本毛衣编织教学书:“选个你喜欢得样式,天冷了我给你织件毛衣”

HappyFather:“你?织毛衣?我没有听错吧!”

HappyMother:“这算什么,有了这本书,毛裤我也会织!”

情景解释:毛衣编织教学的书就相当一个模板,HappyMother 可以根据上面的样式织自己喜欢的毛衣

其他应用:模板可以作为核心业务的抽象,针对不同的业务在具体实现,达到复用核心业务

 

VISITOR----访问者模式

模式定义:表示一个作用于某对象结构重的各元素的操作,它使你可以在不改变各元素类

的前提下定义作用于这个元素的新操作

使用频率:

使用情景:

    您在为自己的冰箱闲职无用而发愁吗?Happy家原来也是,不过现在不用发愁了

HappyFather 买了一整头猪回来,而且还做了一份详细的计划:猪头煮熟了做凉菜,

猪腿呢就做水晶肘子,猪的前榜可以肉馅。。。。。。。,不过如果你的冰箱不够大可不要

HappyFather的做法

情景解释:针对猪的不同位置可以采用不同的做法,就像遍历对象所有的节点,针对不同的

节点采用不同的操作。

 

创建型模式

ABSTRACT FACTORY---抽象工厂

定义:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类

使用频率:  

使用情景:

HappyFather HapperMother吵架了,HappyFather 回家发现桌子上一张纸条写着做家务,于是HappyFather 开始擦地板、刷马桶、收拾房间、做饭,足足忙了好几个小时,终于理解HappyMother的辛苦,遂主动道歉

情景解释:写着做家务的纸条就相当于抽象工厂,HappyFather 根据它决定做什么工作

 

BUILDER---生成器

定义:将一个复杂对象的构建与他的表示相分离,使得同样的构建过程可以创建不同的表示。

使用频率:

使用情景:

HappyMother 很奇怪为什么HappyFather 每次都能构把衣服弄得污渍,汗渍血渍一团糟,这么脏的衣服要先经过手洗,然后才能放到洗衣机中一起洗

情景解释:针对洗衣服这个过程可以有机洗和手洗两个不同的洗涤过程

 

FACTORY MEHOD---工厂方法

定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method 使一个类的实例化延迟到了子类

使用频率:

使用情景:

每个月1日是Happy 家值得庆祝的日子,因为这天是HappyFather发工资的日子,除了好好美餐一顿,HappyMother 还会给Happyson 50元作为零花钱,至于什么时候花,买什么东西就由HappySon自己决定了

情景解释:HappyMother 把零花钱给HappySon ,HappySon自己决定如何消费

 

PROTOTYPE---原型

定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型赖创建新的对象

使用频率:

使用情景:

HappyMother :“每天都要买菜、洗菜、炒菜 ,我烦了不管做了”

HappyFather:“老婆最近超市开始供应蔬菜拼盘,各种蔬菜都已经搭配好了,我去买一盘素三鲜,一盘鱼香肉丝,买回去回家一炒就行了,方便的很”

情景解释:各种蔬菜拼盘就是炒菜的模型

 

SINGLETON---单件

定义:保证一个类只有一个实例,并提供一个访问他的全局访问点

使用频率:

使用情景:

HappyFather:儿子不许随便拿这个玩!

HappySon:老爸这个是什么呀?

HappyFather:这个呢是咱家的户口本,开始呢只有我得户口页,后来增加了HappyMother的户口页,后来又增加了你的户口页,以后还会增加好多户口页你的儿子的,儿子的孙子的,子子孙孙的。。。。。。

情景解释:全家只有一个户口本,通过增加户口页来访问它

其他应用:计数器,购物车

 

结构型模式

 

ADAPTER----适配器

定义:将一个类的接口转换成客户希望的另外一个接口,Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

使用频率:

使用情景:

时间:1960年自然灾害期间

HappyMother:“他爸,孩子就要上学了,可一件像样的衣服也没有呀”

HappyFather:“有什么办法呀!饭都吃不饱哪有钱买衣服呀,不然你把我的衣服改一下!”

HappyMother:“Good  Idea ! 就这样HappyFather的衣服被改成了HappySon的衣服

情景解释:HappyFather 的衣服通过HappyMother 的裁减变成了HappySon 可以穿的衣服

 

BRIDGE---桥接

定义:将抽象部分与它的实现部分相分离,使他们可以独立的变化

使用频率:

使用情景:

HappyFather 爱吃豆腐(此处无引申意),下班得时候买一些豆腐,HappyMother 高兴怎么做就怎么做(小葱拌豆腐,麻辣豆腐,麻婆豆腐)

情景解释:针对做豆腐这个抽象,HappyMother 有很多实现方法

 

COMPOSITE---组合模式

定义:将对象组合成树形结构以表示部分整体的关系,Composite使得用户对单个对象和组合对象的使用具有一致性

使用频率:

使用情景:

   Happyson 两周岁

HappyMother 告诉HappyFather :“儿子要是闹着不听话,你可以可以给他唱歌哄他睡觉,也可以摇晃他哄它睡觉,也可以边唱歌边摇晃他哄它睡觉,也可以讲故事哄他睡觉,也可以边讲故事边摇晃他哄他睡觉”

情景解释:哄儿子睡觉的方法很多,也可以将几个方法结合使用,所有的方法都可以统一对待

其他应用:树形结构遍历 

DECRATOR---装饰

定义:动态的给一个对象增加一些额外的职责,就增加的功能来说,Decorator模式相比生成子类更加灵活

使用频率:

使用情景:

时间:2003年夏 非典期间

HappyFather:“老婆,你怎么在我的口罩上绣字了呀”

HappyMother:“这样口罩不但可以防病毒还美观呀”

HappyFather:“可为什么要绣上‘别吻我’呀”

HappyMother:“可以提醒汽车司机不要撞到你呀”

情景解释:为口罩增加了额外的职责

 

FAÇADE---外观

定义:为子系统中的一组接口提供一致的界面,FAÇADE 提供了一个高层接口,这个接口使得子系统更容易使用

使用频率:

使用情景:

 HappyMother 把所有的东西都收拾的井井有条,她把自己的衣服按休闲装,职业装、晚装分类放在不同的柜子中,出席什么样的场合就到那个柜子里面选合适的衣服

情景解释:不同类型的衣服通过柜子就能进行区分。

 

FLYWEIGHT—享元

使用频率:

使用情景:

HappyFather:“老婆咱家有没有Flyweight 模式的例子呀”

HappyMother:“老公 什么是Flyweight 模式呀”

HappyFather:“就是运用共享技术有效地支持大量细粒度的对象”

HappyMother:“那杯子算不算呀可以用来泡茶、泡咖啡、和你打架的时候还可以做暗器”

HappyFather:“。。。 。。。”

模式解释:杯子作为共享对象,可以同时在不同的场景中使用,只是根据他的外部状态,所起的作用不同

 

PROXY---代理

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

使用频率:

使用情景:

HappySon学校校长办公室

校长:“你要好好教训一下你的儿子,他在学校里面和同学打架了”

HappyFather:“小孩子之间打打闹闹很正常呀”

校长:“和别人打打闹闹正常,可是他把我儿子打哭了”

HappyFather:“啊!对不起,回家我一定好好教训他”

HappyFather 回家后教训HappySon:“我告诉你记住了,下次打谁也不要打校长的儿子”

情景解释:HappyFather HappySon的代理