GOF设计模式(命令模式,访问者模式,迭代器模式,观察者模式)
baijin 2024-10-01 07:33:06 博客文章 11 ℃ 0 评论
命令模式(命令也是类)
- 基本介绍:会将一个请求封装为一个对象,以便使用不同参数来表示不同的请求(即命名),同时命令模式也支持可撤销的操作
- 类图
- 角色:
- Command(命令):负责定义命令的接口
- ConcreteCommand(具体的命令):实现Command角色中定义的接口(聚合接收者)
- Receiver(接收者):Command角色执行命令的对象
- Invoker(发动者):开始执行命令的角色,调用Command角色中定义的方法(聚合命令)
- 优点:将发动者和接收者进行解耦,能够保存命令的历史记录
- 缺点:可能导致某些系统有过多的具体命令类,增加了系统的复杂度(类爆炸)
- 应用场景:界面的一个按钮都是一条命令、模拟CMD(DOS命令) 订单的撤销/恢复、触发-反馈机制
访问者模式(访问数据结构并处理数据)
- 基本介绍:封装一些作用于某种数据结构的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。主要将数据结构与数据操作分离,解决 数据结构和操作耦合性问题。
- 类图:
- 角色:
- Visitor (访问者):为该对象结构中的ConcreteElement的每一个类(具体元素)声明一个visit操作。(方法中也会接收Element 对象)
- ConcreteVisitor (具体访问者):是一个具体的访问值,实现每个有Visitor 声明的操作,是每个操作实现的部分
- ObjectStructure (对象结构):负责处理Element 角色的集合,(聚合Element 角色)为了让ConcreteVisitor 角色能遍历处理每一个Element 角色
- Element (元素):Visitor 角色的访问对象。定义一个accept 方法,接收一个访问者对象
- ConcreteElement(具体元素): 实现了accept 方法
- 双分派(双重分发 double dispatch)
- accept(接收)方法的调用:element.accept (visitor) ;
- 而visitor(访问)方法的调用:visitor.visit (element);
- 对比发现他们两个方法时想法关系,element接收visitor,而visitor又访问element
- 在该模式中,ConcreteVisitor和ConcreteElement角色两个共同决定了实际进行的处理
- 优点:
- 容易增加ConcreteVisitor 角色(因为增加对数据的具体操作时只需要增加一个ConcreteVisitor类即可)
- 缺点:
- 不易增加ConcreteElement(因为当增加具体元素时,数据结构发生改变,势必要修改具体访问者的方法)
- 违背了依赖倒转原则。访问者依赖的是具体元素,而不是抽象元素。(当对具体的数据操作时,必须要传入具体的元素)
- 使用场景:如果一个系统有比较稳定的数据结构,又有经常变化的功能需求,就可以尝试该模式
迭代器模式(一个一个遍历)
- 基本介绍:提供一种遍历集合元素的统一接口,用一致的方法遍历集合元素( hasnext() 方法进行逐一遍历),不需要知道集合对象的底层表示,即:不暴露其内部的结构。
- 类图
- 角色:
- Iterator(迭代器):该角色责任定义按顺序逐个遍历元素的接口程序中,定义了hasNext(用于判断是否存在下一个元素)和next(用与获取该元素)两个方法。
- Concretelterator(具体的迭代器):该角色负责实现Iterator角色所定义的接口.该角色包含了遍历集合所必须的信息。(聚合ConcreteAggregate角色的集合并进行逐一遍历)
- Aggregate(集合):该角色负责定义创建Iterator角色的接口。这个接口是一个方法会创建出一个,按照顺序访问保存在我内部元素的人。
- ConcreteAggregate(具体集合):该角色负责实现Aggregate角色所定义的接口。他会创建出具体的Iterator角色
观察者模式:(发布订阅模式)(发送状态变化通知)
- 基本介绍:它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。在观察者模式中,主题是通知的发布者,它发出通知时并不需要知道谁是它的观察者,可以有任意数目的观察者订阅并接收通知。(Jdk的Observable类就使用了观察者模式)
- 类图
- 角色
- Subject(抽象主题):将所有观察者对象的引用保存到一个聚集里(observers ArrayList),抽象主题提供一个接口,可以增加( attach () )和删除( detach () )观察者对象,还声明了“获取现在的状态”的方法(notifyObserver () )。
- Concrete Subject(具体主题):将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。
- Observer(抽象观察者):为所有的具体观察者定义一个接口,在得到主题通知时更新自己。(与Subject是多对一的关系)
- Concrete Observer(具体观察者):实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调。
- 优点:观察者模式解除了被观察者和具体观察者的耦合,让耦合的双方都依赖于抽象,而不是依赖具体。
- 缺点:Java中的消息的通知默认是顺序执行的,一个观察者的卡顿会影响整体的执行效率。
- 应用场景:对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。( 对象仅需要将自己的更新通知给其他对象而不知道其他对象的细节需要。)
本文暂时没有评论,来添加一个吧(●'◡'●)