Observer 模式
观察者模式(Observer),又叫发布订阅模式(Publish/Sunscribe)模式,定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
类图
说明
-
Subject(观察对象)
Subject角色表示观察对象。Subject角色定义了注册观察者和删除观察者的方法。
-
ConcreteSubject(具体的观察对象)
ConcreteSubject角色表示具体的被观察对象。当自身状态发生变化后,它会通知所有已注册的Observer角色。
-
Observer(观察者)
Observer角色负责接收来自Subject角色的状态变化的通知。
-
ConcreteObserver(具体的观察者)
ConcreteObserver角色表示具体的Observer。当它的Update方法被调用后,会去获取要观察的对象的最新状态。
其他
将一个系统分割成一系列相互协作的类有一个很不好的副作用,那就是需要维护相关对象的一致性。我们不希望为了维护一致性而使用各类紧密耦合,这样会给维护、扩展和重用都带来不方便。
观察者模式所做的工作其实就是在解除耦合。让耦合的双方都依赖抽象,而不是依赖于具体。从而使的各自的变化都不会影响另外一边的变化。
当一个对象的改变需要同时改变其他对象,而且它不知道具体有多少个对象有待改变是,应该考虑使用观察者模式。
Memento 模式
备忘录模式(Memento),在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。
类图
说明
-
Originator(发起人)
负责创建一个备忘录Memento,用以记录当前时刻它的内部状态,并可使用备忘录恢复内部状态。Originator可根据需要决定Memento存储Originator的哪些内部状态。
-
Memento(备忘录)
负责存储Originator对象的内部状态,并可防止Originator以外的其他对象访问备忘录Memento。备忘录有两个接口,Caretaker只能看到备忘录的窄接口,它只能将备忘录传递给其他对象。Originator能够看到一个宽接口,允许它访问返回到先前状态所需的所有数据。
-
Caretaker(管理者)
负责保存好备忘录Memento,不能对备忘录的内容进行操作或检查。
State 模式
状态模式(State ),当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。
类图
说明
-
State(状态)
State角色表示状态,定义了根据不同状态进行不同处理的接口(API)。该接口(API)是那些处理内容依赖于状态的方法的集合。
-
ConcreteState(具体状态)
ConcreteState角色表示各个具体的状态,它实现了State接口。
-
Context(状况、前后关系、上下文)
Context角色持有表示当前状态的ConcreteState角色。此外,它还定义了共外部调用者使用State模式的接口(API)。