行为型模式(上)

行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配

一、模板方法模式

1. 概念
1)模板方法(Template Method)模式的定义如下:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。它是一种类行为型模式
2. 优缺点
1)优点

	(1)它封装了不变部分,扩展可变部分。它把认为是不变部分的算法封装到父类中实现,而把可变部分算法由子类继承实现,便于子类继续扩展

	(2)它在父类中提取了公共的部分代码,便于代码复用

	(3)部分方法是由子类实现的,因此子类可以通过扩展方式增加相应的功能,符合开闭原则

2)缺点

	(1)对每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大,设计也更加抽象

	(2)父类中的抽象方法由子类实现,子类执行的结果会影响父类的结果,这导致一种反向的控制结构,它提高了代码阅读的难度	
3. 模式的结构
1)抽象类(Abstract Class):负责给出一个算法的轮廓和骨架。它由一个模板方法和若干个基本方法构成

	(1)模板方法:定义了算法的骨架,按某种顺序调用其包含的基本方法。

	(2)基本方法:是整个算法中的一个步骤,包含以下几种类型

		a. 抽象方法:在抽象类中申明,由具体子类实现

		b. 具体方法:在抽象类中已经实现,在具体子类中可以继承或重写它

		c. 钩子方法:在抽象类中已经实现,包括用于判断的逻辑方法和需要子类重写的空方法两种

2)具体子类(Concrete Class):实现抽象类中所定义的抽象方法和钩子方法,它们是一个顶级逻辑的一个组成步骤

在这里插入图片描述

4. 应用场景
1)算法的整体步骤很固定,但其中个别部分易变时,这时候可以使用模板方法模式,将容易变的部分抽象出来,供子类实现

2)当多个子类存在公共的行为时,可以将其提取出来并集中到一个公共父类中以避免代码重复。首先,要识别现有代码中的不同之处,并且将不同之处分离为新的操作。最后,用一个调用这些新的操作的模板方法来替换这些不同的代码

3)当需要控制子类的扩展时,模板方法只在特定点调用钩子(类似开关)操作,这样就只允许在这些点进行扩展
5. 扩展
1)在模板方法模式中,基本方法包含:抽象方法、具体方法和钩子方法,正确使用“钩子方法”可以使得子类控制父类的行为

二、策略模式

1. 概念
1)策略(Strategy)模式的定义:该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户

2)策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理
2. 优缺点
1)优点

	(1)多重条件语句不易维护,而使用策略模式可以避免使用多重条件语句

	(2)策略模式提供了一系列的可供重用的算法族,恰当使用继承可以把算法族的公共代码转移到父类里面,从而避免重复的代码

	(3)策略模式可以提供相同行为的不同实现,客户可以根据不同时间或空间要求选择不同的		

	(4)策略模式提供了对开闭原则的完美支持,可以在不修改原代码的情况下,灵活增加新算法

	(5)策略模式把算法的使用放到环境类中,而算法的实现移到具体策略类中,实现了二者的分离

2)缺点

	(1)客户端必须理解所有策略算法的区别,以便适时选择恰当的算法类

	(2)策略模式造成很多的策略类
3. 模式的结构
1)抽象策略(Strategy)类:定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现

2)具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现

3)环境(Context)类:持有一个策略类的引用,最终给客户端调用

在这里插入图片描述

4. 应用场景
1)一个系统需要动态地在几种算法中选择一种时,可将每个算法封装到策略类中

2)一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现,可将每个条件分支移入它们各自的策略类中以代替这些条件语句

3)系统中各算法彼此完全独立,且要求对客户隐藏具体算法的实现细节时

4)系统要求使用算法的客户不应该知道其操作的数据时,可使用策略模式来隐藏与算法相关的数据结构

5)多个类只区别在表现行为不同,可以使用策略模式,在运行时动态选择具体要执行的行为
5. 扩展
1)在一个使用策略模式的系统中,当存在的策略很多时,客户端管理所有策略算法将变得很复杂,如果在环境类中使用策略工厂模式来管理这些策略类将大大减少客户端的工作复杂度	

三、命令模式

1. 概念
1)命令(Command)模式的定义如下:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理
2. 优缺点
1)优点

	(1)降低系统的耦合度。命令模式能将调用操作的对象与实现该操作的对象解耦

	(2)增加或删除命令非常方便。采用命令模式增加与删除命令不会影响其他类,它满足“开闭原则”,对扩展比较灵活

	(3)可以实现宏命令。命令模式可以与组合模式结合,将多个命令装配成一个组合命令,即宏命令

	(4)便实现 Undo 和 Redo 操作。命令模式可以与后面介绍的备忘录模式结合,实现命令的撤销与恢复	

2)缺点

	(1)能产生大量具体命令类。因为对每一个具体操作都需要设计一个具体命令类,这将增加系统的复杂性
3. 模式的结构
1)抽象命令类(Command)角色:声明执行命令的接口,拥有执行命令的抽象方法 execute()

2)具体命令角色(Concrete    Command)角色:是抽象命令类的具体实现类,它拥有接收者对象,并通过调用接收者的功能来完成命令要执行的操作

3)实现者/接收者(Receiver)角色:执行命令功能的相关操作,是具体命令对象业务的真正实现者

4)调用者/请求者(Invoker)角色:是请求的发送者,它通常拥有很多的命令对象,并通过访问命令对象来执行相关请求,它不直接访问接收者	

在这里插入图片描述

4. 应用场景
1)当系统需要将请求调用者与请求接收者解耦时,命令模式使得调用者和接收者不直接交互

2)当系统需要随机请求命令或经常增加或删除命令时,命令模式比较方便实现这些功能	

3)当系统需要执行一组操作时,命令模式可以定义宏命令来实现该功能	

4)当系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作时,可以将命令对象存储起来,采用备忘录模式来实现
5. 拓展
1)在软件开发中,有时将命令模式与前面学的组合模式联合使用,这就构成了宏命令模式,也叫组合命令模式。宏命令包含了一组命令,它充当了具体命令与调用者的双重角色,执行它时将递归调用它所包含的所有命令(在调用者内部维护一个list<AbstractCommond> ,然后遍历调用)	

2)命令模式还可以同备忘录(Memento)模式组合使用,这样就变成了可撤销的命令模式

四、责任链模式

1. 概念
1)责任链(Chain of Responsibility)模式的定义:为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止
2. 优缺点
1)优点

	(1)降低了对象之间的耦合度。该模式使得一个对象无须知道到底是哪一个对象处理其请求以及链的结构,发送者和接收者也无须拥有对方的明确信息

	(2)增强了系统的可扩展性。可以根据需要增加新的请求处理类,满足开闭原则

	(3)增强了给对象指派职责的灵活性。当工作流程发生变化,可以动态地改变链内的成员或者调动它们的次序,也可动态地新增或者删除责任

	(4)责任链简化了对象之间的连接。每个对象只需保持一个指向其后继者的引用,不需保持其他所有处理者的引用,这避免了使用众多的 if 或者 if···else 语句

	(5)责任分担。每个类只需要处理自己该处理的工作,不该处理的传递给下一个对象完成,明确各类的责任范围,符合类的单一职责原则
	
2)缺点

	(1)不能保证每个请求一定被处理。由于一个请求没有明确的接收者,所以不能保证它一定会被处理,该请求可能一直传到链的末端都得不到处理

	(2)对比较长的职责链,请求的处理可能涉及多个处理对象,系统性能将受到一定影响

	(3)职责链建立的合理性要靠客户端来保证,增加了客户端的复杂性,可能会由于职责链的错误设置而导致系统出错,如可能会造成循环调用	
3. 模式的结构
1)抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接

2)具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者

3)客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程		

在这里插入图片描述

4. 应用场景
1)有多个对象可以处理一个请求,哪个对象处理该请求由运行时刻自动确定

2)可动态指定一组对象处理请求,或添加新的处理者

3)在不明确指定请求处理者的情况下,向多个处理者中的一个提交请求
5. 拓展
1)纯的职责链模式:一个请求必须被某一个处理者对象所接收,且一个具体处理者对某个请求的处理只能采用以下两种行为之一:自己处理(承担责任);把责任推给下家处理

2)不纯的职责链模式:允许出现某一个具体处理者对象在承担了请求的一部分责任后又将剩余的责任传给下家的情况,且一个请求可以最终不被任何接收端对象所接收

五、状态模式

1. 概念
1)状态(State)模式的定义:对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为
2. 优缺点
1)优点

	(1)状态模式将与特定状态相关的行为局部化到一个状态中,并且将不同状态的行为分割开来,满足“单一职责原则”

	(2)减少对象间的相互依赖。将不同的状态引入独立的对象中会使得状态转换变得更加明确,且减少对象间的相互依赖

	(3)有利于程序的扩展。通过定义新的子类很容易地增加新的状态和转换

2)缺点

	(1)状态模式的使用必然会增加系统的类与对象的个数

	(2)状态模式的结构与实现都较为复杂,如果使用不当会导致程序结构和代码的混乱
3. 模式的结构
1)环境(Context)角色:也称为上下文,它定义了客户感兴趣的接口,维护一个当前状态,并将与状态相关的操作委托给当前状态对象来处理

2)抽象状态(State)角色:定义一个接口,用以封装环境对象中的特定状态所对应的行为

3)具体状态(Concrete    State)角色:实现抽象状态所对应的行为

在这里插入图片描述

4. 应用场景
1)当一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为时,就可以考虑使用状态模式

2)一个操作中含有庞大的分支结构,并且这些分支决定于对象的状态时
5. 拓展
1)在有些情况下,可能有多个环境对象需要共享一组状态,这时需要引入享元模式,将这些具体状态对象放在集合中供程序共享

参考网址

行为型模式概述(行为型模式的分类)

注:文章是经过参考其他的文章然后自己整理出来的,有可能是小部分参考,也有可能是大部分参考,但绝对不是直接转载,觉得侵权了我会删,我只是把这个用于自己的笔记,顺便整理下知识的同时,能帮到一部分人。
ps : 有错误的还望各位大佬指正,小弟不胜感激

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值