设计模式之行为型模式
行为型模式
行为型模式: 关注系统中对象之间的相互交互,研究系统在运行时对象之间的相互通信和协作,进一步明确对象的职责,
创建型模式: 关注对象的创建过程
结构型模式: 关注对象和类的组织
行为模式汇总
责任链模式: 避免请求发送者和接收者耦合,让多个对象都有可能接收请求,将这些对象连成一条链,并且沿着这条链传递请求,直到有对象处理为止
命令模式: 将一个请求封装为一个对象,从而使得请求调用者和接收者解耦
解释器模式: 描述如何为语言定义一个文法,如何解析
迭代器模式: 提供了一种方法来访问聚合对象
中介者模式: 通过一个中介对象来封装一系列的对象交互,使得各对象不需要互相引用
备忘录模式: 捕获一个对象的内部状态,并保存之,需要时,可以恢复到保存的状态
观察者模式: 当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新
状态模式: 允许一个对象在其内部状态改变时改变它的行为
策略模式: 定义一系列算法,并将每个算法封装在一个类中
模板模式: 定义一个操作的算法骨架,将某些易变的步骤延迟到子类中实现
访问者模式: 表示一个作用于某对象结构中的各元素的操作,它使得用户可以在不改变各元素的前提下定义作用于这些元素的新操作
责任链模式
将能够处理同一类请求的对象连成一条链,所提交的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求,如果能则处理,如果不能则传递给链上的下一个对象
场景
公司里面,请假条的审批过程:
• 如果请假天数小于3天,主任审批
• 如果请假天数大于等于3天,小于10天,经理审批
• 如果大于等于10天,小于30天,总经理审批
• 如果大于等于30天,提示拒绝
添加新的处理对象
由于责任链的创建完全在客户端,因此新增新的具体处理者对原有类库没有任何影响,只需添加新的类,然后在客户端调用时添加即可。符合开闭原则
迭代器模式iterator
提供一种可以遍历聚合对象的方式,又称为:游标cursor模式
聚合对象:存储数据
迭代器:遍历数据
中介者模式Mediator
核心:
如果一个系统中对象之间的联系呈现为网状结构,对象之间存在大量多对多关系,将导致关系及其复杂,这些对象称为"同事对象"
我们可以引入一个中介者对象,使各个同事对象只跟中介者对象打交道,将复杂的网络结构化解
中介者模式的本质
解耦多个同事对象之间的交互关系,每个对象都持有中介者对象的引 用,只跟中介者对象打交道。我们通过中介者对象统一管理这些交互 关系
开发中常见的场景:
- MVC模式(其中的C,控制器就是一个中介者对象。M和V都和他打交 道)
- 窗口游戏程序,窗口软件开发中窗口对象也是一个中介者对象
- 图形界面开发GUI中,多个组件之间的交互,可以通过引入一个中介者 对象来解决,可以是整体的窗口对象或者DOM对象
- Java.lang.reflect.Method#invoke()
命令模式command
将一个请求封装为一个对象,从而使我们可用不用的请求对客户进行参数化,对请求排队或者记录请求日志,以及支持可撤销的操作,也称之为:动作Action模式,事务transaction模式
结构:
Command抽象命令类
ConcreteConnand具体命令类
Invoker调用者/请求者
请求的发送者,它通过命令对象来执行请求,一个调用者并不需要在设计时确定其接收者,因此它只与抽象命令类之间存在关联,在程序运行时,将调用命令对象的execute(),间接调用接收者的相关操作
Receiver接收者
接收者执行与请求相关的操作,具体实现对请求的业务处理
未抽象前,实际执行操作内容的对象
Client客户类
在客户类中需要创建调用者对象,具体命令类对象,在创建具体命令对象时指定对应的接收者,发送者和接收者之间没有直接关系,都通过命令对象间接调用
解释器模式Interpreter
是一种不常用的设计模式
用于描述如何构成一个简单的语言解释器,主要用于使用面向对象语言开发的 编译器和解释器设计。
当我们需要开发一种新的语言时,可以考虑使用解释器模式。
尽量不要使用解释器模式,后期维护会有很大麻烦。在项目中,可以使用 Jruby,Groovy、java的js引擎来替代解释器的作用,弥补java语言的不足。
访问者模式Visitor
模式动机:
对于存储在一个集合中的对象,他们可能具有不同的类型(即使有一个公共的接 口),对于该集合中的对象,可以接受一类称为访问者的对象来访问,不同的访 问者其访问方式也有所不同。
定义:
表示一个作用于某对象结构中的各元素的操作,它使我们可以在不改变个元素 的类的前提下定义作用于这些元素的新操作。
策略模式strategy
场景:
某个市场人员接到单后的报价策略(CRM系统中常见问题)。报价策略 很复杂,可以简单作如下分类:
普通客户小批量报价
普通客户大批量报价
老客户小批量报价
老客户大批量报价
具体选用哪个报价策略,这需要根据实际情况来确定。这时候,我们 采用策略模式即可。
策略模式对应于解决某一个问题的一个算法族,允许用户从该算法族 中任选一个算法解决某一问题,同时可以方便的更换算法或者增加新 的算法。并且由客户端决定调用哪个算法。
模板方法模式 template method
模板方法模式是编程中经常用的模式,它定义了一个操作中的算法骨架,将某些步骤延迟到子类中实现,这样,新的子类可以在不改变一个算法结构的前提下重新定义该算法的某些特定步骤
处理某个流程的代码已经都具备,但是其中某个节点的代码暂时不能确定。因此我们采用工厂方法模式,将这个节点的代码实现转移给子类完成。即:处理步骤父类中定义好,具体实现延迟到子类中定义
什么时候使用模板方法模式
实现一个算法时,整体步骤很固定。但是,某些部分易变,易变部分可以抽象出来,供子类实现
状态模式state
用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题
观察者模式Observer
场景
聊天室程序的创建。服务器创建好后,ABC三个客户端连接上来公开聊天,A向服务器发送数据,服务器端聊天数据改变,我们希望将这些聊天数据分别发给其他在线的客户,也就是说,每个客户端需要更新服务端得数据
网站上,很多人订阅了"java主题"的新闻,当有这个主题新闻时,就会将这些新闻发送给所有订阅的人
大家一起玩CS游戏时,服务器需要将每个人的方位变化发送给所有的客户
上面这些场景,我们都可以使用观察者模式来处理,我们可以把多个订阅者、客户称之为观察者,需要同步给多个订阅者的数据封装到对象中,称之为目标
核心
观察者模式主要用于1:N的通知,当一个对象(目标对象Subject或Objservable)的状态变化时,他需要及时告知一系列对象(观察者对象,Observer)令他们做出响应
通知观察者的方式
推
每次都会把通知以广播方式发送给所有观察者,所有观察者只能被动接收
拉
观察者之哟啊知道情况即可,至于上面时候获取内容,获取什么内容,都可以自主决定
Java SE提供了java.util.Observable和java.util.Observer来实现观察者模式
备忘录模式
就是保存某个对象内部状态的拷贝,这样以后就可以将该对象恢复到 原先的状态。