软件开发设计模式之【11】个【行为型】设计模式

代码码云仓库地址:https://gitee.com/dzxmy/design_pattern

常用的行为型设计模式有:策略模式,责任链模式,模板方法模式,状态模式

不常用的行为型设计模式有:观察者模式,备忘录模式,迭代器模式,中介者模式,命令模式,访问者模式,解释器模式

一、模板方法模式

定义:定义了一个算法的骨架,并允许子类为一个或者多个步骤提供实现

模板方法使得子类可以不改变算法结构的情况下,重新定义算法的某些步骤

类型:行为型

适用场景:

  • 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现
  • 各个子类中公共的行为被提取出来并集中到一个公共父类中,从而避免代码重复

优点: 提高复用性,提高扩展性,符合开闭原则

缺点:类数目的增加,增加了系统实现的复杂度,继承关系自身缺点,如果父类添加新的抽象方法,所有子类都要改一遍

com.dzx.design.behavioral.templatemethod 包下代码:模板方法模式
 

二、 迭代器模式

定义:提供一种方法,顺序访问一个集合对象中的各个元素,而又不暴露该对象的内部表示

类型:行为型

适用场景:访问一个集合对象的内容而无需暴露它的内部表示

为遍历不同的集合结构提供一个统一接口

优点:分离了集合对象的遍历行为

缺点:类的个数成对增加

com.dzx.design.behavioral.iterator 包下代码: 迭代器模式
 

 三、策略模式

定义:定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化不会影响到使用算法的用户。

通过策略模式可以消除掉大量的if....else.....

类型:行为型

适用场景:

  • 系统有很多类,而他们的区别仅仅在于他们的行为不同
  • 一个系统需要动态地在几种算法中选择一种

优点:开闭原则,避免使用多重条件转移语句,提高算法的保密性和安全性

缺点:客户端必须知道所有的策略类,并自行决定使用哪一个策略类,产生很多策略类

com.dzx.design.behavioral.strategy 包下代码:策略模式 

 

四、解释器模式 

定义:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。

为了解释一种语言,而为语言创建的解释器。

类型:行为型

适用场景:某个特定类型问题发生频率足够高。

优点:语法由很多类表示,容易改变及扩展此语言

缺点:当语法规则数目太多时,增加了系统的复杂度

com.dzx.design.behavioral.interpreter 包下代码: 解释器模式
 

jdk中的正则Pattern 就用到解释器模式。 

spring 中的ExpressionParser 解释器

五、观察者模式

 定义:定义了对象之间的一对多依赖,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,它的所有依赖者观察者都会收到通知并更新

类型:行为型

适用场景:关注行为场景,建立一套触发机制

优点:观察者和被观察者之间建立了一个抽象的耦合,观察者模式支持广播通信

缺点:观察者之间有过多的细节依赖,提高时间消耗及程序复杂度,使用要得当,要避免循环调用


  
  1. /**
  2. * 观察者模式
  3. * Course课程作为被观察者 需要继承 Observable 类,在有学生提出问题的时候调用父类的
  4. * setChanged();
  5. * notifyObservers(question) 这两个方法
  6. * Teacher老师作为观察者 需要实现 Observer 接口 重写update方法,就可以在有问题被学生提出的
  7. * 时候,自动的收到该问题。
  8. *
  9. */
com.dzx.design.behavioral.observer 包下代码: 观察者模式
 

 

com.dzx.design.behavioral.observer.event 包下代码:guava方式利用EventBus实现观察者模式
 

 

六、备忘录模式

定义:保存一个对象的某个状态,以便在适当的时候恢复对象。”后悔药“

类型:行为型

适用场景:保存及恢复数据相关业务场景,后悔的时候,即想恢复到之前的状态

优点:为用户提供一种可恢复的机制,存档信息的封装

缺点:资源占用

com.dzx.design.behavioral.memento 包下代码:备忘录模式
 

 

七、命令模式

定义:将”请求“封装成对象,以便使用不同的请求

命令模式解决了应用程序中对象的职责以及他们之间的通信方式

类型:行为型

适用场景:请求调用者和请求接收者需要解耦,使得调用者和接收者不直接交互,需要抽象出等待执行的行为

优点:降低耦合,容易扩展新命令或者一组命令

缺点:命令的无限扩展会增加类的数量,提高系统实现复杂度

com.dzx.design.behavioral.command 包下代码: 命令模式
 

 八、中介模式

定义:定义一个封装一组对象如何交互的对象

通过使对象明确地相互引用来促进松散耦合,并允许独立地改变它们的交互

类型: 行为型

适用场景:系统中对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱且难以理解,交互的公共行为,如果需要改变行为则可以增加新的中介者类

优点:将一对多转化成了一对一,降低程序的复杂度,类之间解耦

缺点:中介者过多,导致系统复杂

com.dzx.design.behavioral.mediator 包下代码:中介者模式
 

 九、责任链模式

定义:为请求创建一个接收此次请求对象的链

类型:行为型

适用场景:一个请求的处理需要多个对象中的一个或几个协作处理

优点:请求的发送者和接收者解耦,责任链可以动态的组合

缺点:责任链太长或者处理时间过长,影响性能,责任链有可能过多

com.dzx.design.behavioral.chainofresponsibility 包下代码:责任链模式
 

例如我们常常用到的javax.servlet.filter包下的Filter 就是典型的责任链模式

十、访问者模式

定义:封装作用于某数据结构(如list/set/map等)中的各元素的操作  ,可以在不改变各元素的类的前提下,定义作用于这些元素的操作

类型:行为型

适用场景:一个数据结构如list/set/map等包含很多类型对象,数据结构与数据操作分离

优点:增加新的操作很容易,即增加一个新的访问者

缺点: 增加新的数据结构困难,具体元素的变更比较麻烦

com.dzx.design.behavioral.visitor 包下代码: 访问者模式
 

 在 java.nio.file 包下 有个  FileVisitor 就是 使用的 访问者模式

 十一、状态模式

定义:允许一个对象在其内部状态改变时,改变它的行为 ,

类型:行为型

适用场景: 一个对象存在多个状态(不同状态下行为不同,且状态可相互转换)

优点: 将不同的状态隔离,把各种状态的转换逻辑,分布到state的子类中,减少相互间的依赖,增加新的状态非常简单

缺点:状态多的业务场景导致类数目增加,系统变复杂

com.dzx.design.behavioral.state 包下代码:状态模式
 

 

 

 

 

 

 

 

 

 

文章来源: blog.csdn.net,作者:血煞风雨城2018,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq_31905135/article/details/98945678

(完)