设计模式之美重要内容

内容来自王争设计模式之美

1、软件设计原则

设计原则 描述
单一职责 一个类应该只负责一个职责,仅有一个引起其变化的原因
开闭原则 对扩展开放,对修改关闭
里氏替换原则 子类继承父类时,除添加新的方法完成新增功能外,尽量不要重写父类的方法(任何基类可以出现的地方,子类一定可以出现)
依赖倒转原则 对抽象进行编程,不要对实现进行编程
接口隔离原则 一个类对另一个类的依赖应该建立在最小的接口上(客户端不应该被迫依赖于它不使用的方法)
迪米特法则 如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用
合成复用原则 尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现

2、设计模式

创建型模式:将创建和使用代码解耦
结构型模式:将不同功能代码解耦
行为型模式:将不同的行为代码解耦

  • 创建型:将创建和使用代码解耦
    常用的有:单例模式、工厂模式(工厂方法和抽象工厂)、建造者模式
    不常用的有:原型模式
  • 结构型:将不同功能代码解耦
    常用的有:代理模式、适配器模式、装饰者模式、桥接模式
    不常用的有:门面模式、组合模式、享元模式
  • 行为型:将不同的行为代码解耦
    常用的有:观察者模式、模板模式(回调)、策略模式、职责链模式、迭代器模式、状态模式
    不常用的有:访问者模式、备忘录模式、命令模式、解释器模式、中介模式

3、UML

类与类之间都哪些交互关系呢,UML 统一建模语言中定义了六种类之间的关系,它们分别是:继承、实现 | 关联、依赖 | 聚合、组合

  • 继承:extends
  • 实现:implements
  • 依赖:使用关系,一个类使用另一个类作为参数使用或返回值
  • 关联:成员变量
  • 聚合:成员变量,生命周期不同,has a 的关系(课程与学生)
  • 组合:成员变量,生命周期相同,contains a 的关系(鸟与翅膀)

image

4、创建型模式

创建型模式:将创建和使用代码解耦

  • 单例:处理资源访问冲突、表示全局唯一类、线程唯一单例 ConcurrentHashMap<Long, IdGeneratorThread>
  • 简单工厂、工厂方法、抽象工厂:封装对象复杂的创建过程,将对象的创建和使用分离,让代码更加清晰
    你不想直接 new 这个类的对象,怕以后这个类改变的时候你需要回来改代码,而此时依赖这个类的地方已经到处都是了
    这个类的对象构建过程非常复杂,你不愿意将这么复杂的构建过程,一遍又一遍的写在需要用到此对象的地方
    这个类的对象在构建过程中,依赖了很多其他的类,而你无法在调用的地方提供
  • 建造者:创建一种类型的复杂对象,通过设置不同的可选参数,"定制化" 地创建不同的对象
    创建对象的属性有很多
    配置项之间有依赖关系、约束关系
    需要创建的对象,它内部的属性都是不可变对象
    当一个类的构造函数参数个数超过 4 个,而且这些参数有些是可选的参数,考虑使用构造者模式
  • 原型:对象的创建成本比较大(克隆)
    在 Java 语言中,Object 类的 clone() 方法为浅拷贝
    它只会拷贝对象中的基本数据类型(比如 int、long)+ 引用对象(SearchWord)的内存地址,不会递归地拷贝引用对象本身

image
image

5、结构型模式

结构型模式:将不同功能代码解耦

  • 代理:在不改变原始类(或叫被代理类)代码的情况下,通过引入代理类来给原始类附加功能
    代理可以分为静态代理和动态代理
    业务系统的非功能性需求开发
    在 RPC、缓存中的应用
    缓存中的应用
  • 桥接:将抽象和实现解耦,让它们可以独立变化
  • 装饰器:主要解决继承关系过于复杂的问题,通过组合来替代继承,它主要的作用是给原始类添加增强功能
    装饰器类和原始类继承同样的父类,这样我们可以对原始类 "嵌套" 多个装饰器类
    装饰器类是对功能的增强,这也是装饰器模式应用场景的一个重要特点
  • 适配器:一种事后的补救策略
    封装有缺陷的接口设计
    统一多个类的接口设计
    替换依赖的外部系统
    兼容老版本接口
    适配不同格式的数据
  • 门面:为子系统提供一组统一的接口,定义一组高层接口让子系统更易用
  • 组合:将一组对象组织(Compose)成树形结构,以表示一种 "部分 - 整体" 的层次结构
  • 享元:享元模式的意图是复用对象,节省内存,前提是享元对象是不可变对象

image
image
image
image
image

6、行为型模式

行为型模式:将不同的行为代码解耦

  • 观察者:在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有依赖的对象都会自动收到通知
    被观察者依赖观察者集合,当被观察者状态改变时,被观察者需要调用观察者集合的对应方法
  • 模版:在一个方法中定义一个算法骨架,并将某些步骤推迟到子类中实现
  • 回调:双向调用关系,A 调用 B,B 反过来又调用 A(同步回调看起来更像模板模式,异步回调看起来更像观察者模式)
  • 策略:定义一族算法类,将每个算法分别封装起来,让它们可以互相替换(解耦策略的定义、创建、使用)
    策略模式可以使算法的变化独立于使用它们的客户端(这里的客户端代指使用算法的代码)
  • 职责链:将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求
    将这些接收对象串成一条链,并沿着这条链传递这个请求,直到链上的某个接收对象能够处理它为止
  • 状态:状态机有 3 个组成部分,状态(State)、事件(Event)、动作(Action)
    事件也称为转移条件(Transition Condition),事件触发状态的转移及动作的执行,不过动作不是必须的,也可能只转移状态,不执行任何动作
  • 迭代器:将集合对象的遍历操作从集合类中拆分出来,放到迭代器类中,让两者的职责更加单一
  • 访问者:
  • 备忘录:
  • 命令:
  • 解释器:
  • 中介:

image
image
image

7、总图

image

posted @ 2023-06-24 14:57  lidongdongdong~  阅读(161)  评论(0编辑  收藏  举报