1.设计简介
1.1什么是设计模式?
- 面向对象语言开发过程中,遇到种种的场景和问题,提出的解决方案和思路,沉淀下来,解决问题的思路
1.2什么是设计模式六大原则?
- 面向对象语言开发过程中,推荐的一些指导性原则,没有明确的招数,而且也经常被忽视/违背,也是前辈总结,也是为了站在前辈的肩膀上
1.3正确使用设计模式的优点
- 提高思维、编码、设计能力
- 提高效率、缩短开发周期
- 使代码复用性高、可读性强、耦合性低、可维护性高
2.六大原则
2.1单一职责原则
- 定义:一个类只负责一个功能领域中的相应职责,就一个类而言,应该只有一个引起它变化的原因
- 问题由来:如果一个类负责两个职责,当其中一个职责因为需求需要对类进行改变时,有可能导致原本运行正常的另一个职责功能发生故障
- 单一职责原则是实现高内聚、低耦合的指导方针
2.1.1单一职责原则的优点
- 降低类的复杂度
- 提高类的可读性,提高系统的可维护性
- 降低由变类的变更引起功能故障的风险
2.2里氏替换原则
- 定义:所有引用父类的地方必须能透明地使用其子类对象
- 优点:代码共享
- 缺点:耦合性变高,代码灵活性降低,但总体上利大于弊
2.3迪米特法则
- 定义:一个软件实体应当尽量减少与其他实体发生相互作用
- 目的:降低类之间的耦合度、提高模块的相对独立性
- 使用迪米特法则要确保高内聚和低耦合的同时,保证系统的结构清晰
2.3迪米特法则的优点
- 降低了耦合度、提高了模块的相对独立性
- 提高类的复用率、系统的扩展性
2.4依赖倒置原则
- 核心思想:要面向接口编程,不要面向实现编程
2.4.1依赖倒置原则的优点
- 降低耦合性
- 提高系统稳定性
- 减少并行开发引起的风险
- 提高代码的可读性、可维护性
2.5接口隔离原则
- 使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口
2.5.1接口隔离原则的优点
- 提高系统的灵活性、可维护性
- 降低系统的耦合性
- 接口大小可自定义
- 减少代码冗余
2.6开闭原则
- 定义:一个软件实体应当对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展
- 问题与来:任何软件都需要随着需求进行迭代,通过扩展软件实体的行为实现更新迭代,而不是对已有代码进行修改
- 为了满足开闭原则,需要对系统进行抽象化设计,抽象化是开闭原则的关键。以达到只需要增加新的具体类实现更新迭代的目的
2.6.1开闭原则的优点
- 提高代码的复用性
- 提高软件的可维护性
2.创建型
- 对象实例化的模式,用于解耦对象的实例化过程
2.1单列模式
- 某个类智能有一个实例,提供一个全局的访问点
2.2工厂模式
- 一个工厂类根据传入的参量决定创建出哪一种类的实例
2.3抽象工厂模式
- 创建相关或依赖对象的家族,而无需明确指定具体类
2.4建造者模式
- 封装一个复杂对象的创建过程,并可以按步骤构造
2.5原型模式
- 通过复制现有的实例创建新的实例
3.结构型
- 把类或对象结合在一起形成一个更大的结构
3.1适配器模式
- 将一个类的方法接口转换成客户希望的另一个接口
3.2桥接模式
- 将抽象部分和实现部分分离,使他们都可以独立变化
3.3装饰器模式
- 动态的给对象添加新的功能
3.4组合模式
- 将对象组合成树型结构以表示“部分-整体”的层次结构
3.5外观模式
- 对味提供一个统一的方法,来访问系统中的一群接口
3.6享元模式
- 通过共享技术来有效的支持大量细粒度的对象
3.7代理模式
- 为其他对象提供一个代理以便控制这个对象的访问
4.行为型
- 类和对象如何交互及划分责任和算法
4.1模版模式
- 定义一个算法结构,而将一些步骤延迟到子类实现
4.2命令模式
- 将命令请求封装为一个对象,使得可以用不同的请求来进行参数化
4.3迭代器模式
- 一种遍历访问聚合对象中各个元素的方法,不暴露该对象的内部结构
4.4观察者模式
- 对象间的一对多的依赖关系
4.5仲裁者模式
- 用一个中介对象来封装一系列的对象交互
4.6备忘录模式
- 在不破坏封装的前提下,保持对象内部状态
4.7解释器模式
- 给定一个语言,定义他的文法的一种表示,并定义一个解释器
4.8状态模式
- 允许一个对象在器对象内部状态改变时改变它的行为
4.9策略模式
- 定义一系列算法,把他们封装起来,并且使他们可以相互替换
4.10责任链模式
- 将请求地发送者和接收者解耦,使得多个对象都有处理这个请求的机会
4.11访问者模式
- 不改变数据结构的前提下,增加作用于一组对象元素的新功能