设计模式之美重要内容
1、软件设计原则
设计原则 | 描述 |
---|---|
单一职责 | 一个类应该只负责一个职责,仅有一个引起其变化的原因 |
开闭原则 | 对扩展开放,对修改关闭 |
里氏替换原则 | 子类继承父类时,除添加新的方法完成新增功能外,尽量不要重写父类的方法(任何基类可以出现的地方,子类一定可以出现) |
依赖倒转原则 | 对抽象进行编程,不要对实现进行编程 |
接口隔离原则 | 一个类对另一个类的依赖应该建立在最小的接口上(客户端不应该被迫依赖于它不使用的方法) |
迪米特法则 | 如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用 |
合成复用原则 | 尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现 |
2、设计模式
创建型模式:将创建和使用代码解耦
结构型模式:将不同功能代码解耦
行为型模式:将不同的行为代码解耦
- 创建型:将创建和使用代码解耦
常用的有:单例模式、工厂模式(工厂方法和抽象工厂)、建造者模式
不常用的有:原型模式 - 结构型:将不同功能代码解耦
常用的有:代理模式、适配器模式、装饰者模式、桥接模式
不常用的有:门面模式、组合模式、享元模式 - 行为型:将不同的行为代码解耦
常用的有:观察者模式、模板模式(回调)、策略模式、职责链模式、迭代器模式、状态模式
不常用的有:访问者模式、备忘录模式、命令模式、解释器模式、中介模式
3、UML
类与类之间都哪些交互关系呢,UML 统一建模语言中定义了六种类之间的关系,它们分别是:继承、实现 | 关联、依赖 | 聚合、组合
- 继承:extends
- 实现:implements
- 依赖:使用关系,一个类使用另一个类作为参数使用或返回值
- 关联:成员变量
- 聚合:成员变量,生命周期不同,has a 的关系(课程与学生)
- 组合:成员变量,生命周期相同,contains a 的关系(鸟与翅膀)
4、创建型模式
创建型模式:将创建和使用代码解耦
- 单例:处理资源访问冲突、表示全局唯一类、线程唯一单例 ConcurrentHashMap<Long, IdGeneratorThread>
- 简单工厂、工厂方法、抽象工厂:封装对象复杂的创建过程,将对象的创建和使用分离,让代码更加清晰
你不想直接 new 这个类的对象,怕以后这个类改变的时候你需要回来改代码,而此时依赖这个类的地方已经到处都是了
这个类的对象构建过程非常复杂,你不愿意将这么复杂的构建过程,一遍又一遍的写在需要用到此对象的地方
这个类的对象在构建过程中,依赖了很多其他的类,而你无法在调用的地方提供 - 建造者:创建一种类型的复杂对象,通过设置不同的可选参数,"定制化" 地创建不同的对象
创建对象的属性有很多
配置项之间有依赖关系、约束关系
需要创建的对象,它内部的属性都是不可变对象
当一个类的构造函数参数个数超过 4 个,而且这些参数有些是可选的参数,考虑使用构造者模式 - 原型:对象的创建成本比较大(克隆)
在 Java 语言中,Object 类的 clone() 方法为浅拷贝
它只会拷贝对象中的基本数据类型(比如 int、long)+ 引用对象(SearchWord)的内存地址,不会递归地拷贝引用对象本身
5、结构型模式
结构型模式:将不同功能代码解耦
- 代理:在不改变原始类(或叫被代理类)代码的情况下,通过引入代理类来给原始类附加功能
代理可以分为静态代理和动态代理
业务系统的非功能性需求开发
在 RPC、缓存中的应用
缓存中的应用 - 桥接:将抽象和实现解耦,让它们可以独立变化
- 装饰器:主要解决继承关系过于复杂的问题,通过组合来替代继承,它主要的作用是给原始类添加增强功能
装饰器类和原始类继承同样的父类,这样我们可以对原始类 "嵌套" 多个装饰器类
装饰器类是对功能的增强,这也是装饰器模式应用场景的一个重要特点 - 适配器:一种事后的补救策略
封装有缺陷的接口设计
统一多个类的接口设计
替换依赖的外部系统
兼容老版本接口
适配不同格式的数据 - 门面:为子系统提供一组统一的接口,定义一组高层接口让子系统更易用
- 组合:将一组对象组织(Compose)成树形结构,以表示一种 "部分 - 整体" 的层次结构
- 享元:享元模式的意图是复用对象,节省内存,前提是享元对象是不可变对象
6、行为型模式
行为型模式:将不同的行为代码解耦
- 观察者:在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有依赖的对象都会自动收到通知
被观察者依赖观察者集合,当被观察者状态改变时,被观察者需要调用观察者集合的对应方法 - 模版:在一个方法中定义一个算法骨架,并将某些步骤推迟到子类中实现
- 回调:双向调用关系,A 调用 B,B 反过来又调用 A(同步回调看起来更像模板模式,异步回调看起来更像观察者模式)
- 策略:定义一族算法类,将每个算法分别封装起来,让它们可以互相替换(解耦策略的定义、创建、使用)
策略模式可以使算法的变化独立于使用它们的客户端(这里的客户端代指使用算法的代码) - 职责链:将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求
将这些接收对象串成一条链,并沿着这条链传递这个请求,直到链上的某个接收对象能够处理它为止 - 状态:状态机有 3 个组成部分,状态(State)、事件(Event)、动作(Action)
事件也称为转移条件(Transition Condition),事件触发状态的转移及动作的执行,不过动作不是必须的,也可能只转移状态,不执行任何动作 - 迭代器:将集合对象的遍历操作从集合类中拆分出来,放到迭代器类中,让两者的职责更加单一
- 访问者:
- 备忘录:
- 命令:
- 解释器:
- 中介:
7、总图
本文来自博客园,作者:lidongdongdong~,转载请注明原文链接:https://www.cnblogs.com/lidong422339/p/17501133.html