《大话设计模式》笔记(3)——行为型模式1
14、观察者模式
定义:又被称为发布-订阅(Publish/Subscribe)模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
UML:
PS:事件委托就是观察者模式的一种应用,观察者注册主题对象中的状态变化事件,当主题对象状态变化时,就会触发状态变化事件,使得所有注册了该事件的方法都会被触发。
15、模板方法模式
定义:模板方法模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。
UML:
PS:模板方法模式正如其名,父类就相当于是一个模板,提供一个整体的结构,具体类就是应用模板去填充模板里的方法。
应用场景类比:试卷考题
16、命令模式(Command)
定义:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
UML:
PS:我觉得在作者的定义和UML中把请求和接受请求处理的Receiver,定义成一个命令(Command)更容易理解一些,这样定义就可以这样写,“将一个命令封装为一个对象,从而使你可用不同的命令对客户进行参数化;对命令排队或记录命令日志,以及支持可撤销的操作。”,其实作者的这个UML图的Receiver就是一个命令的执行者,我们可以对于不同的命令(Command)来对ConcreteCommand中的命令执行者Receiver来进行配置,而Invoker.ExcuteCommand()就是调用ConcreteCommand.Excute()方法。
参考代码:
17、状态模式(State)
定义:允许一个对象在其内部状态改变时改变它的行为,这个对象看起来像是修改了它的类。
UML:
PS:光看定义时看得一脸茫然,但配合上面UML来解释会更容易弄清楚。上面UML中每个ConcreteState.Handle()内部都有自己所能处理的状态,当状态发生改变时,则把指向自身的状态state指向其它相应的状态,并调用其Handle()去处理。比如最初调用Context.Request()时,它的状态为A,这是state指向ConcreteStateA,调用state.Handle()时,则是调用的ConcreteStateA.Handle(),如果这时Context中的状态改变为B时,这时调用state.Handle()时,还是调用的ConcreteStateA.Handle(),但是ConcreteStateA无法处理状态B,所以这时ConcreteStateA则需要在Handle()中,把state指向ConcreteStateB,并调用ConcreteStateB.Handle()。
该模式与职责链模式容易弄混淆,其区别在于状态模式是强调状态发生变化的情况下,需改变自身的行为;而职责链模式是每个职位上的人内部都知道自己的下一级,当任务自己无法处理时,就把其转给它的下一级。
当一个方法中有许多的状态条件判断时,可以考虑使用状态模式。状态模式把对状态的判断逻辑转移到表示不同状态的一系列类中,简化了复杂的逻辑判断。
应用场景类比:工作的状态随工作时间而发生变化
18、职责链模式(Chain of Responsibility)
定义:在职责链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。
UML:
PS:抽象类Handler中定义了 一个私有的successor,然后每一个具体处理类ConcreteHandler通过SetSuccessor()方法去设置它的下一级,客户端请求处理时直接把请求发给链条的第一个处理者就可以了,职责链模式会将请求传递给适合的处理者。
应用场景类比:加薪审批流程