GoF的23种设计模式

Posted FC的日志

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GoF的23种设计模式相关的知识,希望对你有一定的参考价值。

说起设计模式,首先复习一下设计模式的六大原则:

1、开闭原则(Open Close Principle)

开闭原则的意思是:对扩展开放,对修改关闭。

在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。

简言之,是为了使程序的扩展性好,易于维护和升级。

想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。


2、里氏代换原则(Liskov Substitution Principle)

里氏代换原则是面向对象设计的基本原则之一。

里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。

LSP 是继承复用的基石,只有当派生类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用,而派生类也能够在基类的基础上增加新的行为。

里氏代换原则是对开闭原则的补充。

实现开闭原则的关键步骤就是抽象化,而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。


3、依赖倒转原则(Dependence Inversion Principle)
这个原则是开闭原则的基础,具体内容:针对接口编程,依赖于抽象而不依赖于具体。

4、接口隔离原则(Interface Segregation Principle)

这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。它还有另外一个意思是:降低类之间的耦合度。

由此可见,其实设计模式就是从大型软件架构出发、便于升级和维护的软件设计思想,它强调降低依赖,降低耦合。


5、迪米特法则,又称最少知道原则(Demeter Principle)
最少知道原则是指:一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。

6、合成复用原则(Composite Reuse Principle)
合成复用原则是指:尽量使用合成/聚合的方式,而不是使用继承。


以下是各个设计模式的简述,目前网上大多数都是这种概念,和一些简单的例子,但具体应用到项目中的例子就几乎没有了。后续有时间可以针对各个模式,找一下在项目中实际运用的例子,来加深理解。

###创建型模式

将对象的创建与使用分离

  • 单例模式

    指一个类只有一个实例,且该类能自行创建这个实例的一种模式
    某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式。
    • 汉模式

    • 懒汉模式

  • 原型模式

    用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新实例
  • 工厂方法模式

    定义一个用于创建产品的接口,由子类决定生产什么产品
    客户只知道创建产品的工厂名,而不知道具体的产品名。如 TCL 电视工厂、海信电视工厂等。
    创建对象的任务由多个具体子工厂中的某一个完成,而抽象工厂只提供创建产品的接口。
    客户不关心创建产品的细节,只关心产品的品牌。
    当需要生成的产品不多且不会增加,一个具体工厂类就可以完成任务时,可删除抽象工厂类。这时工厂方法模式将退化到简单工厂模式
  • 抽象工厂模式

    提供一个创建产品族的接口,其每个子类可以生产一系列相关的产品
  • 建造者模式

    将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示
    创建的对象较复杂,由多个部件构成,各部件面临着复杂的变化,但构件间的建造顺序是稳定的。
    创建复杂对象的算法独立于该对象的组成部分以及它们的装配方式,即产品的构建过程和最终的表示是独立的。

###结构型模式

  • 代理(Proxy)模式

为某对象提供一种代理以控制对该对象的访问。
即客户端通过代理间接地访问该对象,从而限制、增强或修改该对象的一些特性。
  • 适配器(Adapter)模式

将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。
  • 桥接(Bridge)模式

将抽象与实现分离,使它们可以独立变化。
它是用组合关系代替继承关系来实现的,从而降低了抽象和实现这两个可变维度的耦合度。

桥接是先有桥,再构建两边的内容,而适配器是先有两边的内容,再进行适配
  • 装饰(Decorator)模式

动态地给对象增加一些职责,即增加其额外的功能。
  • 外观(Facade)模式

为多个复杂的子系统提供一个一致的接口,使这些子系统更加容易被访问。
  • 享元(Flyweight)模式

运用共享技术来有效地支持大量细粒度对象的复用。
  • 组合(Composite)模式

将对象组合成树状层次结构,使用户对单个对象和组合对象具有一致的访问性。

###行为型模式

  • 模板方法(Template Method)模式

定义一个操作中的算法骨架,将算法的一些步骤延迟到子类中,使得子类在可以不改变该算法结构的情况下重定义该算法的某些特定步骤。
  • 策略(Strategy)模式

定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的改变不会影响使用算法的客户。
  • 命令(Command)模式

将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。
  • 职责链(Chain of Responsibility)模式

把请求从链中的一个对象传到下一个对象,直到请求被响应为止。通过这种方式去除对象之间的耦合。
  • 状态(State)模式

允许一个对象在其内部状态发生改变时改变其行为能力。
  • 观察者(Observer)模式

多个对象间存在一对多关系,当一个对象发生改变时,把这种改变通知给其他多个对象,从而影响其他对象的行为。
  • 中介者(Mediator)模式

定义一个中介对象来简化原有对象之间的交互关系,降低系统中对象间的耦合度,使原有对象之间不必相互了解。
  • 迭代器(Iterator)模式

提供一种方法来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。
  • 访问者(Visitor)模式

在不改变集合元素的前提下,为一个集合中的每个元素提供多种访问方式,即每个元素有多个访问者对象访问。
  • 备忘录(Memento)模式

在不破坏封装性的前提下,获取并保存一个对象的内部状态,以便以后恢复它。
  • 解释器(Interpreter)模式

提供如何定义语言的文法,以及对语言句子的解释方法,即解释器。


以上是关于GoF的23种设计模式的主要内容,如果未能解决你的问题,请参考以下文章

GOF 的23种JAVA常用设计模式总结 01 设计模式的概念分类和功能

GoF23种设计模式之行为型模式之模板方法

GoF23种(部分)软件设计模式核心理解

二十三种设计模式(GOF23)详解1----单例模式(Singleton Pattern)

实践GoF的23种设计模式:SOLID原则(上)

GoF 23 种设计模式之代理模式