设计模式笔记
UML入门
- UML基础
- UML类图
- UML时序图
- UML类关系
- UML记忆技巧
7大设计原则
- 开闭原则
- 依赖倒置原则
- 单一责任原则
- 接口隔离原则
- 迪米特原则(最少知道原则)
- 里式替换原则
- 合成复用原则(组合/复用原则)
设计模式-创建型模式
- 工厂方法模式
- 抽象工厂模式
- 建造者模式
- 单例模式
- 原型模式
设计模式-结构型模式
- 适配器模式
- 装饰者模式
- 代理模式
- 外观模式
- 桥接模式
- 组合模式
- 享元模式
设计模式-行为型模式
- 策略者模式
- 观察者模式
- 责任链模式
- 备忘录模式
- 模板方法模式
- 迭代器模式
- 中介者模式
- 命令模式
- 访问者模式
- 解释器模式
- 状态模式
UML类图内容
-
定义
- 统一建模语言(Unified Modeling Language),缩写为UML
- 非专利的第三代建模和规约语言
-
特点
- UML是一种开放的方法
- 用于说明、可视化、构建和编写一个正在开发的面向对象的、软件密集系统的制品的开放方法
- UML展现了一系列最佳工程实践 这些最佳实践在对大规模,复杂系统进行建模方面,特别是在软件架构层次已经被验证有效
-
UML2.2分类(14种)
-
结构式图形: 强调的是系统式得到建模
- 静态图(类图、对象图、包图)
- 实现图(组件图、部署图)
- 剖面图
- 复合结构图
-
行为式图形: 强调系统模型中触发的事件
- 活动图
- 状态图
- 用例图
-
交互式图形: 属于行为式图形子集合,强调系统模型中资料流程
- 通讯图
- 交互概述图
- 时序图
- 时间图
-
-
类图
- Class Diagram: 用于表示类、接口、实例等之间相互的静态关系
- 虽然名字叫类图,但类图中并不只有类
-
时序图
-
记忆技巧
-
UML箭头方向: 从子类指向父类
-
提示: 可能会认为子类是以父类为基础的,箭头应该从父类指向子类(该观点是错误的)
-
记忆技巧-箭头方向
- 定义子类时需要通过extends关键字指定父类
- 子类一定是知道父类定义的,但父类并不知道子类的定义
- 只有知道对象信息时才能指向对方
-
记忆技巧-实线-继承|虚线-实现
- 空心三角箭头: 继承或实现
- 实线-继承: is a 关系,扩展目的,不虚,很结实
- 虚线-实现:虚线代表"虚" 无实体
-
实线-关联关系
- 关系稳定,实打实的关系,铁哥们
- 表示一个类对象和另一个类对象有关联
- 通常是一个类中有另一个类对象作为属性
-
虚线-依赖关系
- 临时用一下,若即若离,虚无缥缈,若有若无
- 表示一种使用关系,一个类需要借助另一个类来实现功能
- 一般是一个类使用另一个类作为参数使用,或作为返回值
-
空心菱形-聚合
- 菱形就是一个盛东西的器皿(例如盘子)
- 聚合: 代表空器皿里可以放很多相同东西,聚在一起(箭头方向所指的类)
- 整体和局部的关系,两者有着独立的生命周期,是has a的关系
- 弱关系
- 消极的词: 弱-空
-
实心菱形-组合
- 组合: 代表器皿里已经有实体结构的存在,生死与共
- 整体与局部的关系,和聚合的关系相比,关系更加强烈,两者有相同的声明周期,contains-a的关系
- 强关系
- 积极的词: 强-满
- 常见数字表达及含义,假设有A类和B类,数字标记在A类侧
- 0…1: 0或1个实例
- 0…*: 0或多个实例
- 1…1: 1个实例
- 1 只能有一个实例
- 1…*: 至少有一个实例
-
UML时序图
- Sequence Diagram: 是显示对象之间交互的图,这些对象是按时间顺序排列的
- 时序图中包括建模元素主要有
- 对象(Actor)
- 生命线(LifeLine)
- 控制焦点(Focus of control )
[外链图片转存失败(img-D8n1QPPB-1569229866491)(images/1569200998600.png)]
-
UML类图
[外链图片转存失败(img-8Nn7fEdI-1569229866528)(images/1569201750781.png)]
-
UML图(摘自大话设计模式)
[外链图片转存失败(img-eqx9ZKmg-1569229866528)(images/1569202420995.png)]
-
7大设计原则
开闭原则
- 定义: 一个软件实体如类、模块和函数应该对扩展开放,对修改关闭
- 用抽象构建框架,用实现扩展细节
- 优点: 提高软件系统的可复用性及可维护性
[外链图片转存失败(img-yWnNYmvm-1569229866528)(images/1569208624300.png)]
依赖倒置原则
- 定义: 高层模块不应该依赖底层模块,二者都应该依赖其抽象
- 抽象不应该依赖细节;细节应该依赖抽象
- 针对接口编程,不要针对实现编程
- 优点: 可以减少类间的耦合性、提高系统稳定性、提高代码可读性和可维护性、可降低修改程序所造成的风险[外链图片转存失败(img-JcmJB1aG-1569229866529)(images/1569208633206.png)]
[外链图片转存失败(img-5lHU2WXy-1569229866529)(images/1569208832335.png)]
[外链图片转存失败(img-EhwsZp8C-1569229866529)(images/1569209020408.png)]
单一职责原则
-
定义: 不要存在多于一个导致类变更的原因
-
一个类/接口/方法只负责一项职责
-
优点: 降低类的复杂度、提高类的可读性,提高系统的可维护性、降低变更引起的风险
类级别的单一职责原则见下图
[外链图片转存失败(img-qP5DtWrC-1569229866529)(images/1569220816440.png)]
接口级别的单一职责原则见下图
[外链图片转存失败(img-VY2wxn0R-1569229866530)(images/1569221676042.png)]
类级别的单一职责原则见下图
[外链图片转存失败(img-1IxXnnCL-1569229866530)(images/1569222214742.png)]
接口隔离原则
- 定义: 用多个专门的接口,而不使用单一的总接口,客户端不应该依赖他不需要的接口
- 一个类对一个类的依赖应该建立在最小的接口上
- 建立单一接口,不要建立庞大臃肿的接口
- 尽量细化接口,接口中的方法尽量少
- 注意适度原则,一定要适度
- 优点: 符合我们常说的高内聚低耦合的设计思想,从而使得类具有很好的可读性、可扩展性和可维护性
未进行隔离之前的UML类图
[外链图片转存失败(img-DxUsE1Yp-1569229866530)(images/1569222881260.png)]
进行接口隔离之后的UML类图如下
[外链图片转存失败(img-myydFRQQ-1569229866530)(images/1569222959737.png)]
迪米特原则
- 定义: 一个对象应该对其他对象保持最少的了解,又叫最少知道原则
- 尽量降低类与类之间的耦合
- 优点: 降低类之间的耦合
- 强调只和朋友交流,不和陌生人说话
- 朋友: 出现在成员变量、方法的输入、输出参数中的类称为成员朋友类,而出现在方法体内部的类不属于朋友类
违背了迪米特原则的
[外链图片转存失败(img-zDbmv8ts-1569229866530)(images/1569224706353.png)]
符合迪米特原则的
69229866530)]
迪米特原则
- 定义: 一个对象应该对其他对象保持最少的了解,又叫最少知道原则
- 尽量降低类与类之间的耦合
- 优点: 降低类之间的耦合
- 强调只和朋友交流,不和陌生人说话
- 朋友: 出现在成员变量、方法的输入、输出参数中的类称为成员朋友类,而出现在方法体内部的类不属于朋友类
违背了迪米特原则的
[外链图片转存中…(img-zDbmv8ts-1569229866530)]
符合迪米特原则的
[外链图片转存失败(img-b26UdJ2p-1569229866531)(images/1569224890510.png)]