设计模式四:观察者,模板方法,命令,状态,职责链条,解释器,中介者,访问者,策略,备忘录,迭代器

1.观察者:Observer

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有

依赖与它的对象都得到通知并被自动更新.

优点:

观察者模式解除了主题和具体观察者的耦合,让耦合的双方都依赖于抽象,而不是依赖具体。

从而使得各自的变化都不会影响另一边的变化。

缺点:

依赖关系并未完全解除,抽象通知者依旧依赖抽象的观察者。

适用场景:

当一个对象的改变需要给变其它对象时,而且它不知道具体有多少个对象有待改变时。

一个抽象某型有两个方面,当其中一个方面依赖于另一个方面,这时用观察者模式可以将

这两者封装在独立的对象中使它们各自独立地改变和复用。

2.模版方法:Template Method

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

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

优点:

模板方法模式通过把不变的行为搬移到超类,去除了子类中的重复代码。

子类实现算法的某些细节,有助于算法的扩展。

通过一个父类调用子类实现的操作,通过子类扩展增加新的行为,符合“开放-封闭原则”。

缺点:

每个不同的实现都需要定义一个子类,这会导致类的个数的增加,设计更加抽象。

适用场景:

在某些类的算法中,用了相同的方法,造成代码的重复。

控制子类扩展,子类必须遵守算法规则。

3.命令:Command

将一个请求封装为一个对象,从而使你可用不同的请求对客户进行

参数化; 可以对请求排队或请求日志,以及支持可撤销的操作。

优点:

* 1 他能较容易地设计一个命令队列

* 2 在需要的情况下,可以较容易地将命令记入日志

* 3 允许接收请求的一方决定是否要否决请求

* 4 可以容易地实现对请求的撤销和重做

* 5 由于加进新的具体命令类不影响其他的类 因此新的具体命令类很容易

适用场景:

1. 命令的发送者和命令执行者有不同的生命周期。命令发送了并不是立即执行。

2. 命令需要进行各种管理逻辑。

3. 需要支持撤消\重做操作(这种状况的代码大家可以上网搜索下,有很多,这里不进行详细解读)。

4.状态:State

允许一个对象在其内部状态改变时改变它的行为,让对象看起来似乎

修改了它的类。

优点:

状态模式将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。

所有状态相关的代码都存在于某个ConcereteState中,所以通过定义新的子类很容易地增加新的状态和转换。

状态模式通过把各种状态转移逻辑分不到State的子类之间,来减少相互间的依赖。

缺点:

导致较多的ConcreteState子类

适用场景:

当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式来。

一个操作中含有庞大的分支结构,并且这些分支决定于对象的状态。

5.职责链:Chain Of Responsibleity

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间

的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求 ,直到有

一个对象处理它为止。

职责链模式的优点:

降低耦合度

可简化对象的相互连接

增强给对象指派职责的灵活性

增加新的请求处理类很方便

职责链模式的缺点:

不能保证请求一定被接收。

系统性能将受到一定影响,而且在进行代码调试时不太方便;可能会造成循环调用。

在以下情况下可以使用职责链模式:

有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。

在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。

可动态指定一组对象处理请求。

6.解释器:Interpreter

给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个

解释器,使用该表示来解释语言中的句子。

好处:

* 可以很容易地改变和拓展文法,因为该模式使用类

* 来表示文法规则,你可使用集成来改变或拓展该

* 文法。也比较容易实现文法,因为定义抽象语法树

* 中各个节点的类的实现大体类似,这些类都易于直接编写。

不足:

* 解释器模式为文法中的每一条规则至少定义了一个类

* 因此包含许多规则的文法可能难以管理和维护

* 建议当文法非常复杂时,使用其他的技术如语法

* 分析程序或编译器生成器来处理

适用环境:

①重复发生的问题可以使用解释器模式

②一个简单语法需要解释的场景

7.中介者:Mediator

用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显

式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

中介者模式优点:

* 1.Mediator的出现减少了各个 Colleague 的耦合,使得

* 可以独立地改变和复用各个 Colleague类和Mediator

* 2由于把对象如何协作进行了抽象,将中介作为一个独立的

* 概念并将其封装在了一个对象中,这样关注的对象就从对象

* 各自本身的行为转移到它们之间的交互上来,也就是站在一个更宏观的角度去看待系统

缺点:

* 由于ConcreteMediator 控制了集中化,于是就把交互复杂性

* 变为了中介者的复杂性,这就使得中介者会变得比任何一个ConcreteColleague 都复杂

使用终结者模式的场合:

1.一组定义良好的对象,现在要进行复杂的通信。

2.定制一个分布在多个类中的行为,而又不想生成太多的子类。

中介对象主要是用来封装行为的,行为的参与者就是那些对象,但是通过中介者,这些对象不用相互知道。

8.访问者:Visitor

一个作用于某对象结构中的各元素的操作。它使你可以在不改变元素

的类的前提下定义作用于这些元素的新操作。

优点:

1、使得新增新的访问操作变得更加简单。

2、能够使得用户在不修改现有类的层次结构下,定义该类层次结构的操作。

3、将有关元素对象的访问行为集中到一个访问者对象中,而不是分散搞一个个的元素类中。

缺点:

1、增加新的元素类很困难。在访问者模式中,每增加一个新的元素类都意味着要在抽象访问者角色中

增加一个新的抽象操作,并在每一个具体访问者类中增加相应的具体操作,违背了“开闭原则”的要求。

2、破坏封装。当采用访问者模式的时候,就会打破组合类的封装。

3、比较难理解。貌似是最难的设计模式了。

模式适用场景:

1、对象结构中对象对应的类很少改变,但经常需要在此对象结构上定义新的操作。

2、需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让

这些操作“污染”这些对象的类,也不希望在增加新操作时修改这些类。

9.策略:Strategy

定义一系列算法,把它们一个个封装起来,并且使它们可替换。本模

式使得算法可独立于使用它的客户而变化。

优点:

策略类之间可以自由切换,由于策略类实现自同一个抽象,所以他们之间可以自由切换。

易于扩展,增加一个新的策略对策略模式来说非常容易,基本上可以在不改变原有代码的基础上进行扩展。

避免使用多重条件.

缺点:

维护各个策略类会给开发带来额外开销

必须对客户端(调用者)暴露所有的策略类

模式适用场景:

1)许多相关的类仅仅是行为有异。

2)需要使用一个算法的不同变体。

3)算法使用客户不应该知道的数据。

4)一个类定义了多种行为 , 并且这些行为在这个类的操作中以多个条件语句的形式出现。

10.备忘录:Memento

不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外

保持这个状态。这样以后就可将该对象恢复到原先保存的状态。

使用备忘录模式的好处:

1)有时一些发起人对象的内部信息必须保存在发起人对象以外的地方,但是必须要由发起人对象自己读取,

这时使用备忘录模式可以把复杂的发起人内部信息对其他的对象屏蔽起来,从而可以恰当地保持封装的边界。

2)本模式简化了发起人类。发起人不再需要管理和保存其内部状态的一个个版本,客户端可以自

行管理他们所需要的这些状态的版本。

3)当发起人角色的状态改变的时候,有可能这个状态无效,这时候就可以使用暂时存储起来的备忘录将状态复原。

使用备忘录模式的缺点:

1)如果发起人角色的状态需要完整地存储到备忘录对象中,那么在资源消耗上面备忘录对象会很昂贵。

2)当负责人角色将一个备忘录存储起来的时候,负责人可能并不知道这个状态会占用多大的存储空间,

从而无法提醒用户一个操作是否很昂贵。

使用备忘录模式的场合:

1)功能比较复杂的,但是需要维护或记录属性历史的类。

2)需要保存的属性只是众多属性的一小部分时。

11.迭代器:Iterator

提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对

象的内部表示。

迭代器模式的优点有:

1、它支持以不同的方式遍历一个聚合对象。

2、迭代器简化了聚合类。

3、在同一个聚合上可以有多个遍历。

4、在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。

迭代器模式的缺点:

对于比较简单的遍历(像数组或者有序列表),使用迭代器方式遍历较为繁琐

迭代器模式的适用场景:

1、访问一个聚合对象的内容而无须暴露它的内部表示。

2、需要为聚合对象提供多种遍历方式。

3、为遍历不同的聚合结构提供一个统一的接口。

原文地址:https://www.cnblogs.com/xiaoyingying/p/8810874.html

时间: 2024-11-25 14:40:02

设计模式四:观察者,模板方法,命令,状态,职责链条,解释器,中介者,访问者,策略,备忘录,迭代器的相关文章

php设计模式 四 (观察者 原型模式 迭代器模式)

观察者模式 观察者模式(有时又被称为发布-订阅Subscribe>模式.模型-视图View>模式.源-收听者Listener>模式或从属者模式)是软件设计模式的一种.在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知.这通常透过呼叫各观察者所提供的方法来实现.此种模式通常被用来实现事件处理系统. 当一个对象的状态发生改变时,依赖他的对象全部会接到通知,并自动更新.观察者模式实现了低耦合 非入侵式的通知与更新机制. 观察者模式示例: 首先创建一个事

Java设计模式(四) 之 模板方法模式

源码均以JDK1.8作为参考 1.定义: 定义一个操作中的算法的框架,而将一些步骤延迟到子类中.使得子类可以不改变一个算法的机构即可重定义该算法的某些特定步骤. 2.解析: 通用类图: 类图解析: 模板方法模式非常简单,仅仅使用了Java的继承机制,但它是一个应用非常广泛的模式. 2.1.抽象模板(AbstractClass) 主要定义了模板中一些基本操作(方法),它的方法分为两类: 基本方法: 基本方法也叫基本操作,是由子类实现的方法,并且被模板方法被调用. 模板方法: 可以由一个或几个,一般

设计模式四:模板方法模式

模板方法模式:定义一个操作中算法的框架,而将一些步骤延迟到子类中.模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. Template Method Pattern:  Define the skeleton of an algorithm in an  operation, deferring some steps to subclasses. Template Method lets  subclasses redefine certain steps of an

【白话设计模式四】单例模式(Singleton)

转自:https://my.oschina.net/xianggao/blog/616385 0 系列目录 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二]外观模式(Facade) [白话设计模式三]适配器模式(Adapter) [白话设计模式四]单例模式(Singleton) [白话设计模式五]工厂方法模式(Factory Method) [白话设计模式六]抽象工厂模式(Abstract Factory) [白话设计模式七]策

设计模式 ( 十八 ):State状态模式 -- 行为型

1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ellse语句来做状态判断来进行不同情况的处理.但是对复杂状态的判断就显得“力不从心了”.随着增加新的状态或者修改一个状体(if else(或switch case)语句的增多或者修改)可能会引起很大的修改,而程序的可读性,扩展性也会变得很弱.维护也会很麻烦.那么我就考虑只修改自身状态的模式. 例子1:按钮来控制一个电梯的状态,一个电梯开们,关门,停,

大话设计模式(四)单例模式的优与劣

大话设计模式(四)单例模式的优与劣 前言 首先来明确一个问题,那就是在某些情况下,有些对象,我们只需要一个就可以了,比如,一台计算机上可以连好几个打印机,但是这个计算机上的打印程序只能有一个,这里就可以通过单例模式来避免两个打印作业同时输出到打印机中,即在整个的打印过程中我只有一个打印程序的实例.     简单说来,单例模式(也叫单件模式)的作用就是保证在整个应用程序的生命周期中,任何一个时刻,单例类的实例都只存在一个(当然也可以不存在). 下图是单例模式的结构图. 下面就来看一种情况(这里先假

设计模式之Command(命令)(转)

Command模式是最让我疑惑的一个模式,我在阅读了很多代码后,才感觉隐约掌握其大概原理,我认为理解设计模式最主要是掌握起原理构造,这样才对自己实际编程有指导作用.Command模式实际上不是个很具体,规定很多的模式,正是这个灵活性,让人有些confuse. Command定义 不少Command模式的代码都是针对图形界面的,它实际就是菜单命令,我们在一个下拉菜单选择一个命令时,然后会执行一些动作. 将这些命令封装成在一个类中,然后用户(调用者)再对这个类进行操作,这就是Command模式,换句

iptables ip报文 tcp报文 tcp三次握手四次端口 有限状态机 状态转移

linux 网络防火墙 netfilter :是内核的一个frame :框架 iptables :数据报文过滤:nat mangle等规则生成工具 网络知识: IP报文首部   tcp报文首部 hdr len   报头首部长度  给出的字节需要乘以横向 32/8 = 4字节 Type of Service(服务类型)    服务类型 Total Length(总长度)          报文总长度    包括表头与内容 (Data) 部分.最大可达 65535 bytes.   注: 报文总长度

C++设计模式实现--观察者

概述 在软件构建过程中,我们需要为某些对象建立一种"通知依赖关系" --一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知.如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化.使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系.从而实现软件体系结构的松耦合.     意图 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新.[GOF <设计模式>]  特点: 1.  Subj

云计算设计模式(六)——命令和查询职责分离(CQRS)模式

云计算设计模式(六)--命令和查询职责分离(CQRS)模式 隔离,通过使用不同的接口,从操作读取数据更新数据的操作.这种模式可以最大限度地提高性能,可扩展性和安全性;支持系统在通过较高的灵活性,时间的演变;防止更新命令,从造成合并在域级别上的冲突. 背景和问题 在传统的数据管理系统中,这两个命令(更新数据)和查询(请求数据),针对在一个单一的数据存储库中的相同的一组实体的执行.这些实体可以是在关系数据库中的一个或多个表,如SQL Server的行的子集. 典型地,在这些系统中,所有的创建,读取,