💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
## 行为型 设计模式被分成三大类,创建型,结构型,行为型。具体要阐述为什么这么分,这个问题,暂时解决不了,但是我们能做的是,合理的运用它。对于行为型设计模式,区别于其他两种的就是:它侧重的是对“方法”的操作。 下面是对几个行为型的设计模式的理解。 ## 一、模板方法 1、概述 将一个操作的算法的骨架和具体算法实现分离——解耦 骨架在父类中,算法延迟到子类实现,就可以有N多实现——多态的体现 回顾一下类图,看看模板解决的问题: ![](https://box.kancloud.cn/2016-02-18_56c5ce760b191.jpg) **模板的眼**:**;解决代码重复,会算法有既定顺序。** - 使用**继承**,解决代码重复的问题,重复的代码抽象成一个基类,做成模板;杜绝子类出现不变的代码,模板就是为了给子类瘦身。 - **基类中有代码实现**:这里抽象出来不单单是某几个方法声明,方法中是可以有代码实现的。只要是会发生重复的就放到父类中。 - **算法顺序**:父类中(模板)必须有一个既定的方法来执行算法顺序——算法的骨架,是既定的 - 子类只是不同算法的实现父类,不改变算法结构 **2、改造模板----算法骨架灵活** **算法的骨架是既定的,可以修改吗?要不要修改?** 这里的算法骨架顺序跟建造模式类似,顺序基本是稳定。怎么说呢? 一般使用这两种模式的“事物”,它的构成顺序都是稳定的,不是经常需要变动的,这是一个前提,但是并不是说,这个顺序一定不可以改变,为了灵活编程,可以通过委托来实现。往委托队列注册的过程就是排序的过程,委托是一大块,不多说了。 **子类可以扩展父类吗?** 当然是可以扩展的,因为是继承呀。但是个人认为没有多大意义。如果只是为了添加方法到子类中,跟复写方法无关联,那就是有点破坏单一原则的味道了。 **3、建造模式VS模板模式** 相同:都有既定的顺序,仅此而已。 不同:两个设计模式的适用范围不同,解决问题不同,一个是创建型,一个是行为型,其他就不用啰嗦了吧。 ## 二、观察者 **1、观察者的几点认识** - 一对多的依赖关系 - 多个对象观察一个主题 - 主题发生变化,观察的对象随之变化 主题与观察对象,观察对象之间都是陌生的。一方负责变化,通知;一方负责接收,做出对应变化。 生活中的实例:订阅网站。 通过类图来分析观察者的优缺点: ![](https://box.kancloud.cn/2016-02-18_56c5ce761f1c8.jpg) **优点**:解耦是观察者的一大特色。通过依赖倒转,面向接口编程的思想,给多个观察者增加父类接口,让被通知者成为主动观察者,来实现观察者和主题的衔接。 **不足**:主题只能和一种类型的观察者进行关联——从途中可以看出所有的观察者都是继承自一个父类:observer,所以这些观察者都是一个父类,要想增加多个类型的观察者,便有心无力了。 **2、观察模式进阶委托** 那要是我想通知多个类型的观察者怎么办?答案还是——**委托**​ 1. 想要通知其他类型的观察者,需要如下改动:最大的局限就是这个抽象的接口——observer,那么就把它去掉。 1. 抽象类不存在,那么主题中通知的方法(notify)就没有意义了,也去掉。 1. 将动态通知观察者的权利从主题移交给调用者。——主题和观察者彻底解耦。 1. 声明委托,在调用短端注册各种类型的观察者,执行调用。 ## 三、策略模式:封装算法,算法变化不影响用户使用。 (具体的在上篇博客中已经写到了) **总结:**行为型的设计模式还有:职责链,命令,解释,迭代,中介者,备忘录,状态,访问者模式。这里只写了三个,其他的几个没有这几个上手。对于剩下的几个模式:我们本着一个这样的原则:what?when?how?