Java设计模式精讲—课程笔记9
21 观察者模式讲解+Coding+源码解析
21.1 观察者模式讲解
- 定义:定义了对象之间的一对多依赖,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,它的所有依赖者(观察者)都会收到通知并更新;
类型:行为型; - 适用场景:
关联行为场景,建立一套触发机制; - 优点:
观察者和被观察者之间建立一个抽象的耦合;
观察者模式支持广播通信; - 缺点:
观察者之间有过多的细节依赖、提高时间消耗及程序复杂度;
使用要得当,要避免循环调用;
21.2 观察者模式coding
21.3 观察者模式源码解析-jdk-guava
- java.awt.Event -> EventListener;
- guava: EventBus -> GuavaEvent(自行创建)通过subscribe注解实现;
22 备忘录模式讲解+Coding+源码解析
22.1 备忘录模式讲解
- 定义:保存一个对象的某个状态,以便在适当的时候恢复对象;
“后悔药”
类型:行为型; - 适用场景:
保存及恢复数据相关业务场景;
后悔的时候,即想恢复到之前的状态; - 优点:
为用户提供一种可恢复机制;
存档信息的封装; - 缺点:
资源占用; - 相关设计模式:
备忘录模式和状态模式:备忘录模式用实例表示状态,存档的是实例;状态模式用类表示状态;
22.2 备忘录模式coding
- 业务场景:支持网站暂存多个版本的手记;
Article类里:
ArticleMemento里:不需要set方法,只能由Article创建
ArticleMementoManager里:通过栈类型管理Memento
22.3 备忘录模式源码解析-spring
- (jdk中暂未找到典型的备忘录模式实现案例)
- spring-webflow
23 命令模式讲解+Coding+源码解析
23.1 命令模式讲解
- 定义:将“请求”封装成对象,以便使用不同的请求;
命令模式解决了应用程序中对象的职责以及它们之间的通信方式(解耦了发送者和接收者);
类型:行为型; - 适用场景:
请求调用者和请求接收者需要解耦,使得调用者和接收者不直接交互;
需要抽象出等待执行的行为; - 优点:
降低耦合;
容易扩展新命令或者一组命令; - 缺点:
命令的无限扩展会增加类的数量,提高系统实现复杂度; - 相关设计模式:
命令模式和备忘录模式:经常结合使用,可以使用备忘录保存命令的历史记录。
23.2 命令模式coding
- 业务场景:课程视频的开放与关闭;
23.3 命令模式源码-jdk-junit
- Runnable
- junit.framework.Test
经常通过继承TestCase类实现
24 中介者模式讲解+Coding+源码解析
24.1 中介者模式讲解
- 定义一个 封装一组对象如何交互的对象;
通过使对象明确地相互引用来促进松散耦合,并允许独立地改变它们的交互;
类型:行为型; - 适用场景:
系统中对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱且难以理解;
交互的公共行为,如果需要改变行为则可以增加新的中介者类; - 优点:
将一对多转化成了一对一,降低程序复杂度;
类之间解耦; - 缺点:
中介者过多,导致系统复杂; - 相关设计模式:
中介者模式和观察者模式:可以使用观察者模式实现中介者模式中角色间的通信;
24.2 中介者模式coding
- 业务场景:学习群;
24.3 中介者源码解析-jdk
- java.util.Timer中介者,TimerTask被协调的类;