23种设计模式

文章目录

  • 1 设计模式的定义
    • 1.1 设计模式的基本要素
  • 2 类之间的关系
    • 2.1 类之间的关系符号
  • 3 常用的十三大面向对象设计原则
    • 3.1 单一职责原则
    • 3.2 开闭原则
    • 3.3 里氏替换原则
    • 3.4 依赖倒转原则
    • 3.5 接口隔离原则
    • 3.6 合成复合原则
    • 3.7 迪米特法则
  • 4 二十三种设计模式
    • 4.1 五种创建型模式
      • 4.11 抽象工厂模式
      • 4.12 建造者模式
      • 4.13 工厂方法模式
      • 4.14 原型模式
      • 4.15 单例模式
    • 4.2 七种结构型模式
      • 4.21 适配器模式
      • 4.22 桥接模式
      • 4.23 组合模型
      • 4.24装饰模式
      • 4.25外观模式
      • 4.26享元模式
      • 4.27代理模式
    • 4.3 十一种行为型模式
      • 4.31 职责链模式
      • 4.32 命令模式
      • 4.33 解释模式
      • 4.34 迭代器模式
      • 4.35 中介模式
      • 4.36 备忘录模式
      • 4.37 观察者模式
      • 4.38 状态模式
      • 4.39 策略模式
      • 4.310 模板方法模式
      • 4.311 访问者模式

1 设计模式的定义

设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验总结,使用设计模式是为了可重用代码、让代码更容易被他人理解、提高代码的可靠性。

1.1 设计模式的基本要素

模式名称、问题、目的、解决方案、效果、实例代码和相关设计。

2 类之间的关系

关联关系
解释:部分类作为整体类的成员属性。
1)双向关联
2)单项关联
3)自关联
4)多重关联
5)聚合关系
6)组合关系
判断聚合与组合关系看整体类不存时部分类还有没有存在的意义,有意义则是聚合关系,没有意义则是组合关系。
依赖关系
解释:整体类的方法调用另一个类的静态方法,或者在整体类的方法中定义另一个类对象作为其局部变量。
泛化关系
解释:也就是继承关系
接口与实现关系
解释:具体类实现抽象类

2.1 类之间的关系符号

23种设计模式_第1张图片

3 常用的十三大面向对象设计原则

3.1 单一职责原则

定义:一个对象应该只包含单一的职责,并且该职责被完整封装在一个类中。
类的职责:数据职责(属性)与行为职责(方法)
目标:高内聚,低耦合;高可用。

3.2 开闭原则

定义:软件实体对扩展开放对修改关闭。

3.3 里氏替换原则

定义:基类能够替换成它的子类,且替换之后程序运行正常。如一个方法的参数类型是基类那么在运行时可以传入它的子类。是实现开闭原则的方式之一。

使用条件:

  • 子类所有的方法必须在父类中声明。不然在多态下无法调用到子类方法。
  • 父类尽量是抽象类或者接口,子类再实现父类未实现的方法。

3.4 依赖倒转原则

定义:面向接口编程,不要面向实现编程。当类之间是关联关系的时候至少要有一个类是抽象类;类之间是依赖关系的时候应该注入另一个类的父类。依赖倒转原则是在里氏替换原则的基础上来实现的。shi

3.5 接口隔离原则

定义:客服端不应该依赖那些它不需要的接口(方法)
目标:将较大的接口细化,使用多个专门的接口来替换单一的总接口。

3.6 合成复合原则

定义:该原则又称组合/聚合复用原则,尽量使用对象组合,少使用继承来达到复用的目的。
继承复用的坏处:破坏系统的封装性,如java中String类不可被继承。

3.7 迪米特法则

(1)不要和"陌生人"说话
(2)只与直接朋友通信
(3) 每个软件单元对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。
总结:对象之间不直接通信,而使用中间类。降低系统的耦合度。
目标:降低类之间的耦合
模式体现:外观模式

4 二十三种设计模式

4.1 五种创建型模式

简单工厂

结构图:
23种设计模式_第2张图片

4.11 抽象工厂模式

一个工厂生产一个产品族的产品。

结构图:
23种设计模式_第3张图片

角色:

  • AbstractFactory(抽象工厂)
  • ConcreteFactory(具体工厂)
  • AbstractProduct(抽象产品)
  • ConcreteProduct(具体产品)

4.12 建造者模式

创建复杂对象,复杂对象的成员属性称为部件或者零件。一个具体的建造者对应一个产品对象。

结构图:
23种设计模式_第4张图片
角色:

  • Builder(抽象建造者)
  • ConcreteBuilder(具体建造者)
  • Product(产品角色)
  • Director(指挥者)

4.13 工厂方法模式

一个工厂生产一种产品。

结构图:
23种设计模式_第5张图片
角色:

  • Product(抽象产品)
  • ConcreteProduct(具体产品)
  • Factory(抽象工厂)
  • ConcreteFactory(具体工厂)

4.14 原型模式

自我复制,提高对象创建效率。
浅度克隆:只复制对象,不复制对象的成员属性。
深度克隆:既复制对象,又复制对象的成员属性。

结构图:
23种设计模式_第6张图片
角色:

  • Prototype(抽象原型类)
  • ConcretePrototype(具体原型类)
  • Client(客服端)

浅克隆(邮件复制)类图:
23种设计模式_第7张图片
深度克隆(邮件复制)类图:
23种设计模式_第8张图片

4.15 单例模式

一个类只有一个实例存在,分为了懒汉式与饿汉式。

结构图:
23种设计模式_第9张图片
角色:

  • Singleton(单例角色)

4.2 七种结构型模式

结构性模式:描述如何将类或者对象结合在一起形成更大的结构。

4.21 适配器模式

定义:将接口转换成客户希望的另一个接口,适配器模式是接口不兼容的那些类可以在一起工作,其别名为包装类。

结构图:
23种设计模式_第10张图片
角色:

  • Target(目标抽象类)
  • Adapter(适配器)
  • Adaptee(适配者类)
  • Client(客服端)

单向适配(机器人):
23种设计模式_第11张图片
双向适配:
23种设计模式_第12张图片

4.22 桥接模式

定义:将抽象部分与它的实现部分分离,使他们都可以独立地变化。它是一种对象结构型模式,又称为句柄模式或接口模式。两个维度的变化。
结构图:
23种设计模式_第13张图片
角色:

  • Abstraction(抽象类)
  • RefinedAbstraction(扩充抽象类)
  • Implementor(实现类接口)
  • ConcreteImplementor(具体实现类)

4.23 组合模型

定义:组合多个对象形成树形结构以表示“部分-整体”的结构层次。组合模式对单个对象(叶子对象)和组合对象(容器对象)的使用具有一致性。组合模式又称为“部分-整体”模式。

结构图:
23种设计模式_第14张图片
角色:

  • Component(抽象构件)
  • Leaf(叶子构件)
  • Composite(容器构件)
  • Client(客户类)

4.24装饰模式

定义:动态地给对象添加额外的职责,就增加对象的功能来说,装饰模式比生成子类的实现更加灵活。

结构图:
23种设计模式_第15张图片
角色:

  • Component(抽象构件)
  • ConcreteComponent(具体构件)
  • Decorator(抽象装饰类)
  • ConcreteDecorator(具体装饰类)

4.25外观模式

定义:为子系统的一组接口提供一个统一的入口。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

结构图:
23种设计模式_第16张图片
角色:

  • Facade(外观类)
  • SubSystem(子系统类)

4.26享元模式

定义:运用共享技术有效地支持大量细粒度对象的复用。

结构图:
23种设计模式_第17张图片
角色:

  • Flyweight(抽象享元类)
  • ConcreteFlyweight(具体享元类)
  • UnsharedConcreteFlyweight(非共享具体享元类)
  • FlyweightFactory(享元工厂类)

4.27代理模式

定义:给一个对象提供一个代理,并由代理对象控制对原对象的引用。

结构图:
23种设计模式_第18张图片
角色:

  • Subject(抽象主题类角色)
  • Proxy(代理主题角色)
  • RealSubject(真实主题角色)

4.3 十一种行为型模式

定义:行为型模式是在不同的对象之间划分责任和算法的抽象化。

4.31 职责链模式

定义:避免请求发送者与请求接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并沿着链传递请求,直到有对象处理它为止。

结构图:
23种设计模式_第19张图片

模式角色:

  • Handler(抽象处理类)
  • ConcreteHandler(具体处理类)
  • Client(客服端)

4.32 命令模式

定义:将请求封装成一个对象,从而使我们可以用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销额的操作。其别名为动作模式或事物模式。

结构图:
23种设计模式_第20张图片
角色:

  • Command(抽象命令类)
  • ConcreteCommand(具体命令类)
  • Invoker(调用者)
  • Receiver(接收者)
  • Client(客户类)

4.33 解释模式

定义:定义语言的文法,并且建立一个解释器来解释该语言中的句子,这里的“语言”意思是使用规定格式和语法的代码。

结构图:
23种设计模式_第21张图片
角色:

  • AbstractExpression(抽象表达式)
  • TerminalExpression(终结符表达式)
  • NonterminalExpression(非终结表达式)
  • Context(环境类)
  • Client(客服类)

4.34 迭代器模式

提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标。

符合的设计模式:
单一职责
开闭原则

实例:
遥控器

结构图:
23种设计模式_第22张图片
角色:

  • Iterator(抽象迭代器)
  • ConcreteIterator(具体迭代器)
  • Aggregate(抽象聚合类)
  • ConcreteAggregate(具体聚合类)

4.35 中介模式

定义:用一个中介对象来封装一系列的对象交互,中介使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立的改变它们的交互。又称调停者模式。

结构图:
23种设计模式_第23张图片
角色:

  • Mediator(抽象中介者)
  • ConcreteMediator(具体中介者)
  • Colleague(抽象同事类)
  • ConcreteColleague(具体同事类)

设计原则:

  • 开闭原则
  • 迪米特法则

4.36 备忘录模式

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

结构图:
23种设计模式_第24张图片
角色:

  • Originator(原发器)
  • Memento(备忘录)
  • Caretaker(负责人)

4.37 观察者模式

定义:定义对象间一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并自动更新。观察者模式又叫发布-订阅模式、模型-视图模式、源-监听器模式、从属者模式。

结构图:
23种设计模式_第25张图片
角色:

  • Subject(目标)
  • ConcreteSubject(具体目标)
  • Observer(观察者)
  • ConcreteObserver(具体观察者)

符合的设计模式:

  • 开闭原则

4.38 状态模式

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

结构图:
23种设计模式_第26张图片
角色:

  • Context(环境类)
  • State(抽象状态类)
  • ConcreteState(具体状态类)

4.39 策略模式

定义:定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化,也称为政策模式。

结构图:
23种设计模式_第27张图片
角色:

  • Context(环境类)
  • Strategy(抽象策略类)
  • ConcreteStrategy(具体策略类)

4.310 模板方法模式

定义:定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义改算法的某些特定步骤。

结构图:
23种设计模式_第28张图片
角色:

  • AbstractClass(抽象类)
  • ConcreteClass(具体子类)

4.311 访问者模式

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

结构图:
23种设计模式_第29张图片
角色:

  • Visitor(抽象访问者)
  • ConcreteVisitor(具体访问者)
  • Element(抽象元素)

你可能感兴趣的:(设计模式)