我们接着说行为模式:
中介者(Mediator):
定义:
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
结构图:
解释:
将原来两个直接引用或者依赖的对象拆开,在中间加入一个"中介"对象,使得两头的对象分别和"中介"对象引用或者依赖。由于中介者的行为与要使用的数据与具体业务紧密相关,抽象中介者角色提供一个能方便很多对象使用的接口是不太现实的。所以抽象中介者角色往往是不存在 的,或者只是一个标示接口。
中介者模式和外观模式的对比:
举例:联合国安理会
备忘录(Memento):
定义:
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
结构图:
解释:
在这里,我们希望Originator的State是可以备份和恢复的,其他属性是无关的。我们可以在希望备份Originator的地方,调用Creatememento方法,在希望恢复Originator部分属性的地方,调用SetMemento方法,同时Caretaker对Memento进行管理。
举例:保存游戏进度。
观察者(Observer):
定义:
定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主体对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
结构图:
解释:
我们可以看到ConcreteSubject中保留了多个Observer的引用(SubjectSate),在Notify方法中,它会依次调用每个Observer的Update方法,从而更新“订阅者”的状态。
举例:前台观察老板是否回来。
状态(State):
定义:
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
结构图:
解释:
用户只与Context关联,在Context内部,会维护不同状态之间的跳转,简单来说,就是在Handle内部判断传入的state值,如果符合业务逻辑,那么直接调用state的Handle方法;如果不符合,那么修改state值,然后调用相应state的Handle方法。
举例:早中晚的学习状态
策略(Strategy):
定义:
定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。
结构图:
解释:
1.多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。(例如FlyBehavior和QuackBehavior)
2.需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。(例如FlyBehavior和QuackBehavior的具体实现
可任意变化或扩充)
3.对客户(Duck)隐藏具体策略(算法)的实现细节,彼此完全独立。
举例:商场促销
访问者(Visitor):
定义:
表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
结构图:
解释:
这里我们假设集合中只包括了2中不同的类型,ObjectStructure就是上面提到的集合,它包含多个不同的Element元素,业务的核心实现是在ConcreteVisitor1和ConcreteVisitor2中,对于ConcreteElement的Accept方法来说,它只是调用visitor.VisitconcreteElementA方法。
举例:男人和女人的不同
迭代(Iterator):
定义:
提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
结构图:
解释:
.NET来设计了两个接口来实现迭代:IEnumerator和IEnumerable。
举例:公交车查票。