原创 设计模式之我爱我家(上) 收藏
模式无处不在,这里讲述的是happy一家的故事:Happyfather,HappyMother还有HappySOn .本文纯属虚构,如有雷同 那实在是太巧和了。
行为模式:
CHAIN OF RESPONSIBILITY---职责链
定义:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系
使用频率:
使用情景:
HappySon:“老妈 这个题不会做了帮帮我”
HappyMother:“要先这样然后在这样就行了”
HappySon:“老妈 这个又不会了”
HappyMother:“这个我也不会,问你老爸去吧”
HappyFather:“这么简单呀,你们俩去看电视吧,我做完了叫你”
情景解释:HappyFathe和 HappyMother都有辅导HappySon功课的职责,谁会谁就帮忙处理
应用要点:请求没有明确接收者,通过后继者链进行传递请求
COMMAND----命令
定义:将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队和记录请求日志,以及支持可撤销的操作
使用频率:
使用情景:
HappyFather :“KFC 吗?我要一大瓶可乐,我老婆要一中瓶可乐,我儿子要一小瓶还要一个外卖桶”
半个小时后
HappyFather:“我这个大瓶可以不要吗”
KFC送货员:“对不起先生,你预定的就要付钱呀”
HappyFather:“可是Command 模式支持可撤销操作呀”
KFC送货员:“对不起先生,我只是个送外卖的”
情景解释:定餐就是Command 模式,每个人都有不同的请求
应用要点:Command 声明执行操作的接口
INTERPRETER---解释器
定义:给定一个语言,定义他的文法的一个表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子
使用频率:
使用情景:
19××年某天,HappySon 九个月大
Happyson:“哇….哇”
HappyMother :“孩他爸快拿尿布来”
HappySon:“哇哇….哇”
HappyMother:“老公,快冲奶粉,儿子饿了”
HappySon:“嘻…..嘿嘿”
HappyMother:“亲爱的,儿子饭后要看你表演!”
情景解释:happyson的语言 只能由 HappyMother 解释给HappyFather 听
应用要点:将发生频率高的实例表述成一个简单语言的中的句子
ITERATOR---迭代器
定义:提供一个方法顺序访问一个聚合对象的各个元素,而又不需要暴露该对象的内部表示
使用频率:
使用情景:
HappyFather :“快播,琼窑的连续剧都是无病呻吟”
HappyFather :“快播,中国足球比我的脚都臭”
HappyFather:“跳过中央九台 ,全是鸟语听不懂”
HappyFather:“就看这台吧 ,养眼”
HappyMother 上来爆K HappyFather
HappyFather:“别打脸,明天还要上街买菜呢!”
原来HappyFather 要看的是模特大赛
情景解释:所有的电视台就是一个可以顺序访问的集合
应用要点:将对列表的访问和遍历从列表对象中分离出来并放入迭代器对象中
MEDIATOR---中介者
定义:用一个中介对象封装一些列的对象交互
使用频率:
使用情景:
工作调动关系,Happy一家临时搬到了××市,因为××市的人特别不好相处,所以Happyfather 通过房屋中介所租房子:房租资金,配套设施只需和中介所交涉,然后中介所再和房东协商,这样就避免了和房东的直接联系
情景解释:中介所起到了中介的作用
应用要点:将对象之间的交互操作封装到MEDIATOR(中介者)中介者对象中
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的做法
情景解释:针对猪的不同位置可以采用不同的做法,就像遍历对象所有的节点,针对不同的
节点采用不同的操作。
应用要点:Visitor包含两个类层次:一个对应接收操作的对象,另一个对应定义对元素的操作的访问者
创建型模式
ABSTRACT FACTORY--- 抽象工厂
定义:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们的具体类
使用频率:
使用情景:
HappyFather 和 HapperMother 吵架了, HappyFather 回家发现桌子上一张纸条写着“做家务”, 于是HappyFather 开始擦地板、刷马桶、收拾房间、做饭,足足忙了好几个小时,终于理解 HappyMother 的辛苦后主动道歉
情景解释:“做家务”相当于抽象工厂, HappyFather 根据它做一系列相关的家务 .
其他应用:在多个产品的系统或者类库中只需调用抽象工厂就可以创建需要实现的子部分
BUILDER--- 生成器
定义:将一个复杂对象的构建与他的表示相分离,使得同样的构建过程可以创建不同的表示。
使用频率:
使用情景:
HappyMother 很奇怪为什么 HappyFather 每次都能够把衣服弄得污渍、汗渍、血渍一团糟,这么脏的衣服要先经过手洗,然后才能放到洗衣机中一起洗
情景解释:一个复杂对象的各个部件分别创建 , 针对洗衣服这个过程一部分机洗和一部分手洗(复杂的部分)
应用要点:与抽象工厂的区别是其最终只返回一个对象,而抽象工厂返回一系列相关对象
FACTORY METHOD--- 工厂方法
定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类, Factory Method 使一个类的实例化延迟到了子类
使用频率:
使用情景:
每个月 1 日是 Happy 家庆祝的日子,因为这天是 HappyFather 发工资的日子
HappyFather :“你今天做的饭真香”
HappyMother :“肉多了就香,儿子这 50 块钱是你这个月的零花钱!”
HappyFather :“记住不许去网吧上网,那个地方总着火”
情景解释: HappyMother 把零花钱给 HappySon 至于什么时候花,买什么东西就由 HappySon 自己决定了
PROTOTYPE--- 原型
定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型赖创建新的对象
使用频率:
使用情景:
HappyMother :“每天都要买菜、洗菜、炒菜 ,我烦了不管做了”
HappyFather :“老婆最近超市开始供应蔬菜拼盘,各种蔬菜都已经搭配好了,我去买一盘素三鲜,一盘鱼香肉丝,买回去炒一下就行了,方便的很”
HappyMother :“ I Like It ! ”
情景解释:各种蔬菜拼盘就是炒菜的原型,炒一下就能吃了
应用要点: PROTOTYPE 克隆自身从而创建新的对象
SINGLETON --- 单件
定义:保证一个类只有一个实例,并提供一个访问他的全局访问点
使用频率:
使用情景:
HappyFather :“乖儿子不许拿这个玩!”
HappySon :“老爸这个是什么呀? ”
HappyFather :“这个呢是咱家的户口本,开始呢只有我的户口页,后来增加了你妈的户口页,后来又增加了你的户口页,以后还会增加你儿子的,儿子的孙子的,子子孙孙的。。。。。。”
情景解释:全家只有一个户口本,通过增加户口页来访问它
其他应用:计数器,购物车
结构型模式
ADAPTER---- 适配器
定义:将一个类的接口转换成客户希望的另外一个接口, Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
使用频率:
使用情景:
时间: 1960 年自然灾害期间
HappyMother :“他爸,孩子就要上学了,可一件像样的衣服也没有呀”
HappyFather :“有什么办法呀!饭都吃不饱哪有钱买衣服呀,不然你把我的衣服改一下!”
HappyMother :“ Good Idea ! ” 就这样 HappyFather 的衣服被改成了 HappySon 的衣服
情景解释: HappyFather 的衣服通过 HappyMother 的裁剪变成了 HappySon 的新衣服
的衣服
应用要点: ADAPTER 适用于已经存在的类,但接口不符。
BRIDGE--- 桥接
定义:将抽象部分与它的实现部分相分离,使他们可以独立的变化
使用频率:
使用情景:
Happy:Mother :“你说负责打扫房间却只管扫地,你说你做饭却叫外卖,你说你每天早上六点打鸣去总用闹表”
HappyFather :“你也知道我总是说一套做一套呀”
情景解释:“说”是抽象部分和“做”相分离
应用要点:抽象和实现部分分别放在独立的类层次结构中
COMPOSITE--- 组合模式
定义:将对象组合成树形结构以表示部分整体的关系, Composite 使得用户对单个对象和组合对象的使用具有一致性
使用频率:
使用情景:
Happyson 两周岁
HappyMother 告诉 HappyFather :“儿子要是闹着不睡觉,你可以给他唱歌,也可以摇晃他,也可以边唱歌边摇晃”
HappySon :“我不要爸爸摇,跟座过山车似的”
情景解释:哄儿子睡觉的方法很多,也可以将几个方法结合使用,所有的方法都可以统一对待
应用要点:组合部分能够像单个对象一样调用,例如遍历树结构。
DECRATOR---装饰
定义:动态的给一个对象增加一些额外的职责,就增加的功能来说, Decorator 模式相比生成子类更加灵活
使用频率:
使用情景:
时间: 2003 年夏 非典期间
HappyFather :“老婆,你怎么在我的口罩上绣字了呀”
HappyMother :“这样口罩不但可以防病毒还美观呀”
HappyFather :“可为什么要绣上‘别吻我’呀”
HappyMother :“提醒汽车司机不要撞到你呀”
情景解释:为口罩增加了额外的功能
应用要点:将组件嵌入对象而不是使用继承机制
FAÇADE---外观
定义:为子系统中的一组接口提供一致的界面, FAÇADE 提供了一个高层接口,这个接口使得子系统更容易使用
使用频率:
使用情景:
由于 HappyFather 和 HappySon 放纵饮食吃成了两个胖墩, HappyMother 将冰箱锁在一个屋子里,爷俩只能通过 HappyMother 才能吃到各种零食。不过 HappyMother 负责跑腿,爷俩也是不亦舒服。
情景解释: HappyMother 类似于 Happy 父子拿零食的接口, Happy 父子只需吩咐她就行了
应用要点:降低客户程序和子系统的耦合度
FLYWEIGHT— 享元
使用频率:
使用情景:
HappyFather :“老婆咱家有没有 Flyweight 模式的例子呀”
HappyMother :“老公 什么是 Flyweight 模式呀”
HappyFather :“就是运用共享技术有效地支持大量细粒度的对象”
HappyMother :“那杯子算不算呀?可以用来泡茶、泡咖啡、和你打架的时候还可以做暗器”
HappyFather :“。。。 。。。”
模式解释:杯子作为共享对象,可以同时在不同的场景中使用,只是根据它的外部状态,所起的作用不同
应用要点:分离对象的内部和外部状态,根据不同的外部状态应用于不同的场景达到共享对象
PROXY--- 代理
定义:为其他对象提供一种代理以控制对这个对象的访问
使用频率:
使用情景:
HappySon 学校校长办公室
校长:“你要好好教训一下你的儿子,他在学校里面和同学打架了”
HappyFather :“小孩子之间打打闹闹很正常呀”
校长:“和别人打打闹闹正常,可是他把我儿子打哭了”
HappyFather :“啊!对不起,回家我一定好好教训他”
HappyFather 回家后教训 HappySon :“我告诉你记住了,下次打谁也不要打校长的儿子”
情景解释: HappyFather 是 HappySon 的监护人也就是代理
应用要点: Proxy 只提供对实体的访问,实体定义关键功能。