热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

设计模式——行为型模式(二)

      行为型模式描述程序运行时的流程控制(复杂),主要是描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,其中包括了算法与对象间职责的分配。

       行为型模式和结构型模式一样,分为类和对象行为模式,类采用的继承机制来在类间分派行为,对象采用组合或聚合在对象间分配行为。因为组合关系或聚合关系比继承关系耦合度低,所以满足合成复用原则,所以对象行为模式比类行为模式具有更大的灵活性。

这篇博客介绍的行为性模式有:观察者模式、模板方法模式、命令模式、状态模式、职责链模式

一、解释器模式:提供如何定义语言的文法,以及对语言句子的解释方法。(类行为型模式)

设计模式——行为型模式(二)

适用情况:在软件开发中有些问题多次重复出现,而且有一定的相似和规律。如果将它们整理成一种简单的语言,那么这些问题实例就是该语言的一些句子。比如一些数据库语言的应用。

优点:扩展性好(可以通过继承等机制来改变或扩展文法)易实现(语法树中的每个表达式节点类都相似)

缺点:执行效率较低(解释器模式中通常使用大量的循环和递归调用,当要解释的句子较复杂时,其运行速度很慢)引起类膨胀(每条规则至少需要定义一个类)

二、中介者模式:定义一个中介对象来简化原有对象的交互关系,降低对象间的耦合度,使原有对象之间不必相互了解。(对象行为型模式)​​

​​​​​设计模式——行为型模式(二)

适用情况:在现实生活中,常常会出现好多对象之间存在复杂的交互关系,这种交互关系一般是“网状结构”,它要求每个对象都必须知道它需要交互的对象。把“网状结构”改为“星形结构”(类似计算机网络拓扑结构星型)可以大大降低它们之间的“耦合性”,这时只需要定义一个“中介者”就可以了。比如在我们常用的“微信“中介者”就是微信服务器。

优点:降低了对象之间的耦合性,使得对象易于独立地被复用;把对象间的一对多关联转变为一对一的关联,使得系统易于维护和扩展。

缺点:当同级的类太多时,中介者会变得复杂而庞大,逻辑复杂以至于系统难以维护。

三、访问者模式:在不改变集合元素的前提下,为一个集合中的每个元素提供多种访问方式。(对象行为型模式​​​​​​​)​​

设计模式——行为型模式(二)

适用情况:在现实生活里有些集合对象中存在多种元素,且每种元素也存在多种不同的访问者和处理方式。比如,顾客在商场购物时放在“购物车”中的商品,顾客主要关心所选商品的性价比,而收银员关心的是商品的价格和数量。

优点:扩展性好(不修改对象结构中的元素的情况下,为对象结构中的元素添加新的功能);灵活性好(访问者模式将数据结构与作用于结构上的操作解耦)符合单一职责原则(访问者模式把相关的行为封装构成一个访问者,使每一个访问者的功能都比较单一)

缺点:增加新的元素类很困难,每增加一个新的元素类,都要在每一个具体访问者类中增加相应的具体操作,这违背了“开闭原则”。破坏封装,访问者模式中具体元素对访问者公布细节;违反了依赖倒置原则,访问者模式依赖了具体类,而没有依赖抽象类

四、策略模式:定义一系列算法各自封装起来,并使他们可相互替换,使算法可独立与它的客户变化。(对象行为型模式​​​​​​​)

设计模式——行为型模式(二)

适用情况:现实生活中经常遇到多种策略可供选择的情况。比如:出行旅游可以乘坐飞机、乘坐火车、骑自行车或自己开私家车等,超市促销可以釆用打折、满减等方法。

优点:策略模式提供了一系列的可供重用的算法族,用继承可以把算法进行复用,从而避免重复的代码;符合对开闭原则,可以在不修改原代码的情况下,灵活增加新算法。

缺点:造成很多的策略类。

五、备忘录模式:不破坏封装的前提下,捕获一个对象内部状态保存,以后可以随时恢复(对象行为型模式​​​​​​​)

设计模式——行为型模式(二)

适用情况:很多应用软件都提供了这项功能,如 Word、记事本在编辑时按 Ctrl+Z 组合键时能撤销当前操作,使文档恢复到之前的状态。

优点:方便地将数据恢复到某个历史的状态;实现了内部状态的封装;发起人不需要管理和保存其内部状态的各个备份,所有状态信息都保存在备忘录中,并由管理者进行管理,这符合单一职责原则

缺点:资源消耗大

六、迭代器模式:提供一个方法顺序访问聚合对象中的元素,且不需暴露该对象的内部表示(对象行为型模式​​​​​​​)

设计模式——行为型模式(二)

适用情况:需要遍历一个集合,一个很常用的例子是foreace循环遍历

优点:方便地将数据恢复到某个历史的状态;实现了内部状态的封装;发起人不需要管理和保存其内部状态的各个备份,所有状态信息都保存在备忘录中,并由管理者进行管理,这符合单一职责原则

缺点:增加了类的个数,一定程度上增加了系统的复杂性。​​​​​​​


推荐阅读
author-avatar
虚线老母阳
推荐一首歌《春风十里》,我的个人订阅号:虚线老母阳
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有