GOF23设计模式(三)——行为型模式

行为型模式

 

 

 

关注系统中对象之间的交互,研究系统在运行时对象之间的相互通讯和协作,进一步明确对象职责。

 

 

 

 

 

模板方法模式(template method)

 

 

 

 

介绍:

 

 

模板方法定义了一个操作中的算法骨架,将某些步骤(钩子方法)延迟到子类中实现。这样,新的子类可以在不改变一个算法结构的前提下重新定义该算法的某些特定步骤

核心:
处理某个流程的代码已经都具备,但是其中某个节点的代码暂时不能确定。因此,我们采用工厂方法模式,将这个节点的代码实现转移给子类完成。即:处理步骤父类定义好,具体实现延迟到子类中定义

方法回调
在软甲开发中,子类不能调用父类,而通过父类调用子类。这些调用步骤已经在父类中定义好了,完全由父类控制整个过程。

应用:
spring JDBCTemplate

 

 

命令模式(command)

 

 

 

 

介绍:
将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。也称为:动作Action模式、事务transaction模式
结构:
Command抽象命令类
ConcreteCommand具体命令类:持有执行者引用
Invoker调用者/请求者:持有具体命令类的引用
Receiver接收者/执行者
Client

应用:

Struts2中Action,命令的撤销和恢复,事务机制的底层实现

 

 

 

 

迭代器模式(iterator)亦称游标模式(curson)

 

 

 

 

场景:
提供一种可以遍历聚合对象的方式。
角色:
聚合对象:存储数据
迭代器:遍历数据
 
实现:使用内部类定义,可以直接访问外部类的属性
 
JDK内置的Iterator(List/Set)

 

 

 


观察者模式(Observer)

 

 

 

实现广播机制的核心

 

 

 

 

核心:

 

 

观察者模式主要用于1:N的通知。当一个对象(目标对象——消息发布方Subject)的状态变化时,他需要及时告知一系列对象(观察者对象,Observer),令他们做出响应。
 
通知观察者的方式
 
推(push)
每次都会把通知以广播方式发送给所有观察者,所有观察者只能被动接收
拉(pull)
观察者只要知道有情况即可,至于什么时候获取内容,获取什么内容,都可以自主决定
结构:
目标对象:观察者集合,方法:变更、通知
具体目标对象:标识状态值
抽象观察者:接收通知后行为
具体观察者:标识状态值
 
JDK提供java.util.Observable 和 java.util.Observer来实现观察者模式

 

中介者模式(Mediator)

 

核心:
如果一个系统中对象之间的联系呈现为网状结构,对象之间存在大量多对多关系,将导致关系及其复杂,就把这些对象称为“同事对象”。
我们可以引入一个中介者对象,使各个同事对象只跟中介者对象交互,将复杂的网状结构化解成星形结构

结构

抽象中介者
抽象同事
具体中介者 :持有具体同事的聚合,并可以传递信息
具体同事:持有具体中介者的引用,可以交互
 
本质:
解耦对象之间的交互关系
开发中应用:
MVC 中的 C
java.lang.reflect.Method#invoke()

 

 

 

 

备忘录模式(memento)
 

 

 

 

 

核心:
就是保存某个对象内部状态的拷贝,这样以后就可以将该对象恢复到原先的状态。
结构:
源发器类Originator
负责创建备忘录,用于记录当前时刻自身的内部状态,并可使用备忘录恢复内部状态
备忘录类Memento
负责存储Originator对象的内部状态,并可防止Originator以外的其他对象访问
负责人类CareTaker
负责保存Memento

 

 

解释器模式(Interpreter)

 

 

 

介绍:
一种不常用的设计模式
用于描述如何构成一个简单的语言解释器,主要用于使用面向对象语言开发的编译器和解释器设计
尽量不要使用解释器模式,后期不易维护。在项目中,可以使用Jruby/Groovy/java的JS引擎来替代解析器的作用,弥补java的不足。

场景:

EL表达式、正则表达式、sql语法、数学表达式(Math Expression String Parser 、Expression4J)

 

 

状态模式(State)
 

 

 

核心:
用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题
 
结构:
Context环境类
环境类中维护了一个State对象,该对象定义了当前的状态
State抽象状态类
ConcreteState具体状态类
封装了该状态对应的行为
应用:
java Thread.State

 

 

 

 

策略模式(Strategy)
 

 

 

 

 

策略模式对应于解决某一问题的一个算法簇,允许用户从该簇中任选一个算法进行处理,同时可以方便的更换算法或者增加新的算法。并且由客户端决定调用那个算法。

 

本质:
分离算法、选择实现
实现:
接口定义算法,具体实现不同算法形成算法簇
调用者有接口引用,客户端动态指定
应用:
GUI编程中的布局管理
Spring中的Resouce接口,资源访问策略
javax.servlet.http.HttpServlet#service()

 

 

 

 

职责链模式(责任链模式chain of responsibility)
 

 

 

 

 

定义
将能够处理同一类请求的对象连成一条链,所提交的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求,如果能则处理,不能则传递给下一个对象
 
实现:
链表方式:
定义一个抽象类,类中包含链表中下一个的对象引用。具体逻辑方法抽象化由继承子类实现。
非链表方式:
通过集合、数据生成职责链
 
应用:
java中异常捕获、js中事件冒泡/捕获、Servelt中filter

 

 

访问者模式(Visitor)

 

 

模式动机:
对于存储在一个集合中的对象,他们可能具有不同的类型(哪怕实现了相同的接口),对于该集合中的对象,可以接受一类称为访问者的对象来访问,不同的访问者其访问方式也有所不同。
定义
表示一个作用于某对象结构中的各元素的操作,它使我们可以在不改变个元素的类前提下定义作用于这些元素的新操作
应用:
XML文档解析器的设计等复杂集合对象的处理

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值