设计模式

参考https://refactoringguru.cn/design-patterns/adapter
设计模式分为创建、结构、行为的模式,其目的是满足场景要求、封装功能、代码复用或代码解耦。

创建型模式

工厂方法模式
工厂方法模式的本质是:在几个平行类中,有一段代码能在所有类中重用,但是它会用到一段不能重用的代码,这时候将不能重用的代码抽象为父类虚函数,把能重用的代码抽象为父类非虚函数。这里一段代码即一个功能。
前一个功能即产品的使用,后一个功能即产品的生产,所以叫工厂方法模式。
工厂方法模式目的是代码复用、将功能与类解耦。

抽象工厂模式
按不同属性抽象多次,然后聚合。

生成器模式
车由多个组件构成,所以用多继承,不同车组件数量、类型不同,将所有车当做一个类就太大,将每个车当做一个类就太多,这其中显然不同车组件数量、类型有相同的,所以这段代码是可以重用的,那怎么办呢?
生成器模式的本质是:在几个平行类中,一段代码在某几个类中能重用,另一段代码在另几个类中能重用,这两段代码是不耦合的,而且前者的类和后者的类有重合但是不完全相同,这时候将两段代码抽象出来。
这里的代码是构造实例用的,所以叫生成器模式。
生成器模式目的是代码复用。

原型模式
如果你需要复制一些对象,同时又希望代码独立于这些对象所属的具体类,可以使用原型模式。其实就是深拷贝。
原型模式,其目的是满足场景要求。

单例模式
所有单例模式的实现都包含以下两个相同的步骤:
将默认构造函数设为私有,防止其他对象使用单例类的new运算符。
新建一个静态构建方法作为构造函数。 该函数会 “偷偷” 调用私有构造函数来创建对象,并将其保存在一个静态成员变量中。
单例模式同时解决了两个问题:保证一个类只有一个实例。为该实例提供一个全局访问节点。
原型模式,其目的是满足类自身的要求。

结构型模式

适配器模式

满足场景要求、封装功能。

桥接模式
通过聚合父类来合并多继承子类。
和抽象工厂类似。

组合模式
如果你需要实现树状对象结构, 可以使用组合模式。其根节点在最上层,类似一种管理机制,用多态和递归来实现。
是否使用它由功能结构决定。
组合模式优缺点
√你可以利用多态和递归机制更方便地使用复杂树结构。
√开闭原则。 无需更改现有代码, 你就可以在应用中添加新元素, 使其成为对象树的一部分。
×对于功能差异较大的类, 提供公共接口或许会有困难。 在特定情况下, 你需要过度一般化组件接口, 使其变得令人难以理解。

装饰模式
如果你希望在无需修改代码的情况下即可使用对象, 且希望在运行时为对象新增额外的行为, 可以使用装饰模式。
类似于桥接模式,也是聚合父类来合并多继承子类。区别在于父类的主次。
和抽象工厂类似。

门面模式
门面类为包含许多活动部件的复杂子系统提供一个简单的接口。 与直接调用子系统相比, 外观提供的功能可能比较有限, 但它却包含了客户端真正关心的功能。
满足场景要求、封装功能。

享元模式
共享多个对象所共有的相同状态, 让你能在有限的内存容量中载入更多对象。
仅在程序必须支持大量对象且没有足够的内存容量时使用享元模式。
满足场景要求。

代理模式
代理模式建议新建一个与原服务对象接口相同的代理类, 然后更新应用以将代理对象传递给所有原始对象客户端。 代理类接收到客户端请求后会创建实际的服务对象, 并将所有工作委派给它。
满足场景要求、封装功能。

行为模式

责任链模式

满足场景要求。

命令模式
命令模式是一种行为设计模式, 它可将请求转换为一个包含与请求相关的所有信息的独立对象。 该转换让你能根据不同的请求将方法参数化、 延迟请求执行或将其放入队列中, 且能实现可撤销操作。
建立一个类处理从请求到命令的过程。这是因为处理过程很复杂,最好集中管理。
满足场景要求、封装功能。

迭代器模式
迭代器模式是一种行为设计模式, 让你能在不暴露集合底层表现形式(列表、 栈和树等)的情况下遍历集合中所有的元素。
这是在做代码层的解耦,类似于多态。

中介者模式
中介者模式是一种行为设计模式, 能让你减少对象之间混乱无序的依赖关系。 该模式会限制对象之间的直接交互, 迫使它们通过一个中介者对象进行合作。
用于集中处理复杂关系。
封装功能。

备忘录模式
备忘录模式是一种行为设计模式, 允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态。

满足场景要求、封装功能。

观察者模式
观察者模式是一种行为设计模式, 允许你定义一种订阅机制, 可在对象事件发生时通知多个 “观察” 该对象的其他对象。
满足场景要求。

状态模式
状态模式是一种行为设计模式, 让你能在一个对象的内部状态变化时改变其行为, 使其看上去就像改变了自身所属的类一样。它使用有限状态机。
状态模式建议为对象的所有可能状态新建一个类, 然后将所有状态的对应行为抽取到这些类中。原始对象被称为上下文(context),它并不会自行实现所有行为, 而是会保存一个指向表示当前状态的状态对象的引用, 且将所有与状态相关的工作委派给该对象。
满足场景要求、封装功能。

策略模式
策略模式建议找出负责用许多不同方式完成特定任务的类, 然后将其中的算法抽取到一组被称为策略的独立类中。
名为上下文的原始类必须包含一个成员变量来存储对于每种策略的引用。 上下文并不执行任务, 而是将工作委派给已连接的策略对象。
上下文不负责选择符合任务需要的算法——客户端会将所需策略传递给上下文。 实际上, 上下文并不十分了解策略, 它会通过同样的通用接口与所有策略进行交互, 而该接口只需暴露一个方法来触发所选策略中封装的算法即可。
因此, 上下文可独立于具体策略。 这样你就可在不修改上下文代码或其他策略的情况下添加新算法或修改已有算法了。
满足场景要求、封装功能。
类似于状态模式,场景不同。

模板方法模式
模板方法模式是一种行为设计模式, 它在超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。
模板方法模式建议将算法分解为一系列步骤, 然后将这些步骤改写为方法, 最后在 “模板方法” 中依次调用这些方法。
对不同功能的解耦。

访问者模式
访问者模式建议将新行为放入一个名为访问者的独立类中, 而不是试图将其整合到已有类中。 现在,需要执行操作的原始对象将作为参数被传递给访问者中的方法, 让方法能访问对象所包含的一切必要数据。
满足场景要求、封装功能。

posted @ 2021-02-07 16:49  HSS--  阅读(96)  评论(0)    收藏  举报