设计模式大总结——行为型模式第一组

本文详细介绍了五种行为型设计模式:观察者模式阐述了一对多的依赖关系,模板方法模式定义了操作中的算法骨架,命令模式封装了请求,状态模式允许对象在其内部状态改变时改变行为,职责链模式则将多个对象组织成链来处理请求。通过具体例子和应用场景,展示了这些模式如何提高代码的灵活性和可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

观察者模式

定义:

定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己

举例:

老板或者是前台秘书观察外界情况的变化去通知内部员工(看NBA和股票),让员工内部自己改变本身的状态,老板或者是前台秘书只是一个中间者,并不能真正的改变员工的状态

动机:

建立一种对象与对象之间的依赖关系,一个对象发生改变时自动通知其他对象,其他对象将相应做出反应。

实例一

假设猫是老鼠和狗的观察目标,老鼠和狗是观察者,猫叫老鼠跑,狗也跟着叫

 

模板方法模式

定义:

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤

 

举例:

老师让学生抄题,加入每个学生都抄题的话,可能会抄错题,那么自然就更做不对了,所以为了避免这种情况,可以采用模板方法,把所有的问题写在一个方法里,把问题写成一个虚方法,学生们只需要继承于题目的类并重写需方法就可以了,这样就可以避免抄错题了

 

动机

  1. 将相同的代码放在父类中,而将不同的方法实现放在不同的子类中
  2. 在模板方法中,我们需要准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来让子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。

 

实例一

在银行办理业务时,一般都包含几个基本步骤,首先需要取号排队,然后办理具体业务,最后需要对银行工作人员进行评分。无论具体业务是取款、存款还是转账,其基本流程都一样,而每个客户只需要根据自己的情况去办理相应的业务

 

命令模式

动机:

在软件设计时,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个我们只需在程序运行时指定具体的请求接受者即可,此时,可以使用命令模式来进行设计,使得请求发送者与请求接受者消除彼此之间的耦合,让对象之间的调用关系更加灵活

 

定义:

将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化,对请求排队或者记录日志,以及支持可撤销的操作。

 

分析

  1. 本质是对命令进行封装,将发出命令的责任和执行命令的责任分隔开
  2. 每个命令都是一个操作,请求的一方发出请求,要求执行一个操作,接收的一方收到请求,并执行操作
  3. 命令模式允许请求的一方和接收的一方独立开,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收
  4. 使请求本身成为一个对象,这个对象和其他对象一样可以被存储和传递
  5. 关键在于引入抽象命令接口,且发送者针对抽象命令接口编程,只有实现了抽象命令接口的具体命令才能与接受者相关联

 

实例:电视机遥控器

电视机是请求的接收者,遥控器是请求的发送者,遥控器上有一些按钮,不同的按钮对应电视机的不同操作。抽象命令角色由一个命令接口来扮演,有三个具体的命令类实现了抽象命令接口,这三个具体命令类分别代表三种操作:打开电视机、关闭电视机和切换频道。

 

状态模式

动机:

在很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做状态,这样的对象叫做有状态的对象,这样的对象状态是从事先定义好的一系列值中取出的。当一个这样的对象与外部事件产生互动时,其内部状态就会改变,从而使得系统的行为也随之发生变化。

 

图示

 

模式定义:

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

 

模式分析:

  1. 描述了对象状态的变化以及对象如何在每一种状态下表现出不同的行为
  2. 状态模式的关键是引入了一个抽象类来专门表示对象的状态,这个类我们叫做抽象状态类,而对象的每一种具体状态类都继承了该类,并在不同具体状态类中实现了不同状态的行为,包括各种状态之间的转换。

举例:

UML

状态模式的优点:

  1. 封装了转换规则
  2. 枚举可能的状态,在枚举状态之前需要确定状态种类
  3. 将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为
  4. 允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块
  5. 可以让多个环境对象共享一个状态对象,从而减少系统中系统的个数

 

使用环境

  1. 对象的行为依赖于它的状态并且可以根据它的状态改变而改变它的相关行为
  2. 代码中包含大量与对象状态有关的条件语句,这些条件语句的出现,会导致代码的可维护性和灵活性变差,不能方便地增加和删除状态,使客户类与类库之间的耦合增强。在这些条件语句中包含了对象的行为,而且这些条件对应于对象的各种状态。

 

模式的应用:

状态模式在工作流或游戏等类型的软件中得以广泛使用,甚至可以用于这些系统的核心功能设计,如在政府OA办公系统中,一个批文的状态有多种:尚未办理;正在办理;正在批示;正在审核;已经完成等各种状态,而且批文状态不同时对批文的操作也有所差异。使用状态模式可以描述工作流对象(如批文)的状态转换以及不同状态下它所具有的行为。

 

职责链模式

模式动机:

  1. 职责链可以是一条直线,一个环或者一个树形结构,最常见的职责链是直线型,即沿着一条单向的链来传递请求
  2. 链上的每一个对象都是请求出来者,职责链模式可以将请求的处理者组织成一条链,并使请求沿着链传递,由链上的处理者对请求进行相应的处理,客户端无须关心请求的处理细节以及请求的传递,只需将请求发送到链上即可,请请求的发送者和请求的处理者解耦。这就是职责链模式的模式动机

 

模式定义:

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连城一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

 

模式分析:

  1. 很多对象由每一个对象对其下家的引用而连接起来形成一条链
  2. 请求在这条链上传递,直到链上的某一个对象处理此情求为止
  3. 发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任

 

优点:

  1. 降低耦合度
  2. 可简化对象的相互连接
  3. 增强给对象指派职责的灵活性
  4. 增加新的请求处理类很方便

 

使用环境

  1. 有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定
  2. 在不明确指定接收者的情况下,向多个对象中的一个提交一个请求
  3. 可动态指定一组对象处理请求

 

 

评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值