代码码云仓库地址: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 解释器
五、观察者模式
定义:定义了对象之间的一对多依赖,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,它的所有依赖者观察者都会收到通知并更新
类型:行为型
适用场景:关注行为场景,建立一套触发机制
优点:观察者和被观察者之间建立了一个抽象的耦合,观察者模式支持广播通信
缺点:观察者之间有过多的细节依赖,提高时间消耗及程序复杂度,使用要得当,要避免循环调用
-
/**
-
* 观察者模式
-
* Course课程作为被观察者 需要继承 Observable 类,在有学生提出问题的时候调用父类的
-
* setChanged();
-
* notifyObservers(question) 这两个方法
-
* Teacher老师作为观察者 需要实现 Observer 接口 重写update方法,就可以在有问题被学生提出的
-
* 时候,自动的收到该问题。
-
*
-
*/
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