设计模式(七)行为型

205 阅读6分钟

经典的设计模式一共有23种,分别是创建型,结构型,行为型。

结构型有十一种,分别是,观察者模式,模板模式,策略模式,职责链模式,迭代器模式,状态模式,访问者模式,备忘录模式,命令模式,解释器模式,中介模式。

观察者模式

定义:在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有依赖的对象都会自动收到通知。

观察者模式也可以叫丛发布订阅者模式,是讲观察者和被观察者代码解耦的一种方式。

手机的通知中心也可以算是一个观察者模式的例子。我们作为订阅者,也就是观察对象,发布者是手机的具体 APP,当 APP 有消息推送(更新,打折优惠等),会通知所有的订阅者,让我们做出反应,比如去更新 APP。

在 Vue 框架里面也使用到了观察者模式。当数据有改变的是时候,会通知watcher,然后 watcher 会触发响应的操作,从而去更新视图。

策略模式

定义:定义一组算法,将每个算法分别封装起来,让他们可以互相替换。

策略模式通常跟工厂一起配合使用。使用策略模式主要是为了避免多重条件语句,如果逻辑条件不复杂,可以使用 if else 来实现。

职责链模式

定义:将请求的发送和接受解耦,让多个接收对象都有机会处理这个请求。将这些接受对象串成一条链,并沿着这条链传递这个请求,直到链上的某个接收对象能够处理它为止。

在职责链中,多个处理器依次处理同一个请求。一个请求先经过 A 处理器,然后再把请求传递给 B 处理器,B 处理器处理完后再传递给 C 处理器,依次类推,形成一个链条。链条上的处理器各自承担各自的处理职责。一旦某个处理器完成了请求,就不会传递给下一个处理器。

比如,在考试中,一个学渣 A,想要找学霸 D 一起作弊。首先学霸发起了一个答案请求给 C,C 接收到学生 B,学生 B 再给学渣 A ,每个人都完成了自己的职责。不过要是在学生 B 那边,纸条被老师没收了,那这个请求也就完成了。不会再次传递下去。

状态模式

定义:允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。

状态模式通过设置好类的状态和行为,通过事件触发,避免了分支判断逻辑。

和策略模式的不同:策略模式主要是讲究策略类可以互相替换,状态模式是把状态和行为都已经封装好了,状态切换也规定好了。只需要到时候有事件触发状态改变就好。

模板模式

定义:模板模式由两部分组成,一部分是抽象父类,第二部分是具体的实现子类。一般是抽象父类封装子类的算法框架,实现一些公共方法以及封装子类中所有方法的执行顺序。子类通过集成这个抽象类,也继承了整个算法结构,并且可以选择重写父类的方法。

顾名思义,就是模板模式就通过设置一个父类的模板,然后子类复用父类的,但是只是模板而已,也可以子类重写父类的东西。

人的一生大概模板是,上学,工作,结婚,生孩子。我们都按照这个模板走,不过不同的人,可能不一样,上的学校,具体的工作,跟同性结婚还是异性,生几个孩子。

迭代器模式

定义:迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。

迭代器主要是为了更通用地遍历数据,比如在 array 里面forEach方法遍历数组的元素和下标。但是如果是我们获取一组 DOM 元素,里面结构跟数组类似,也可以使用下标来获取具体的值。但是就是不能使用 forEach 来遍历。这时候迭代器就可以派上用场了。

目前 ES6 中的Iterator 接口,任何数据结构只要具有Iterator接口,就可以完成遍历。

现在迭代器基本上都封装在高级语言中了,我们基本上不需要写,直接调用即可。

访问者模式

定义:表示一个作用于某对象结构中的各元素操作。它使你可以在不改变各元素的前提下定义作用于这些元素的新操作。

访问者模式的目的是要把处理从数据结构分离出来。应用场景很少,不常用。

备忘录模式

定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在这个对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

备忘录适用在比较复杂,但是需要维护或者记录属性历史的类。可以根据之前保存的信息,还原到前一个状态。主要用来防丢失,撤销,恢复等。

命令模式

定义:将一个请求封装为一个对象,从而使你可用不同的请求进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。

命令模式是对动作的解耦,把请求对象和执行对象分隔开。命令模式不常用。

解释器模式

定义:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。

解释器一般使用在正则表达式,浏览器解析。平常使用很少。

中介模式

定义:用一个中介对象来封装一系列的对象交互,对象只跟中介者交互。

这是应用迪米特法则的一个例子,。不该有直接依赖关系的类,不要有依赖,有依赖关系的,只依赖必要的接口(中介者)。

跟观察者模式的区别:观察者模式交互关系往往都是单向的,交互关系明确。中介模式交互关系复杂,有可能产生庞大的上帝类。