设计模式:UML、七大设计原则、GoF的设计模式(23种)、其他模式(2种)、J2EE 模式(8种)
推荐书单
- 《设计模式-可复用的面向对象软件元素 Design Patterns-Elements of Reusable Object-Oriented Software》 GoF
- 《图解设计模式》 [日] 结城浩
- 《Head First 设计模式》
参考资料:
- 【B站视频】架构技术:设计模式从记住到忘掉
- 【在线网站】refactoring.guru
七大设计原则SOLID CD
分析原始需求,根据经验预测大概率会发生的需求变更
遵循设计原则去设计角色,从而形成设计模式
概念 | 英文 | 解释 |
---|---|---|
模块 | module | 某个类、某个接口、某个实例。 |
角色 | Actor | 扮演xxx角色,即起到某种xxxxx作用。 每个"模块"都是一个"角色",一类角色可以对应多个模块。 |
变化 | - | 需求功能的变化,即某个方法(功能)有多种实现的可能性 |
抽象角色 | Abstract | 也称契约(约束),一般由抽象类 或接口 扮演 |
具体角色 | Concrete | 也称细节,一般由extends抽象类的具体类 或implements接口的实现类 扮演 |
1、单一职责原则 SRP
英文全称:The Single Responsibility Principle
剥离新角色:应该把角色的"变化"剥离出来,从而形成一个新角色
一个模块应该有且只有一个导致其变化的原因、应该仅作为一个角色
A module should have one, and only one, reason to change.
A module should be responsible to one, and only one, actor.
2、开闭原则 OCP
英文全称:The Open-Close Principle
增加一个抽象和多个具体角色:针对"变化"先增加一个抽象角色(预留开闭空间),再将多种"变化"划分为多个具体角色(封装变化)。
对扩展开放,对修改关闭
A software artifact should be open for extension but closed for modification.
3、里氏替换原则 LSP
英文全称:The Liskov Substitution Principle
子类透明替换父类:所有父类对象出现的地方必须能透明地替换成子类对象。
- 子类不要重写父类非抽象方法,子类只用于扩展功能(不要破坏父类结构)
- 父类尽量使用抽象类:修改父类会影响所有子类,继承导致的高耦合问题("继承"相当于B是一个A,"合成"相当于B有一个A)
If for each object o1 of type S there is an object o2 of type T such that for all programs P defined in terms of T, the behavior of P is unchanged when o1 is substituted for o2 then S is a subtype of T.
4、接口隔离原则 ISP
英文全称:The Interface Segregation Principle
接口最小化:使用多个小的隔离的接口比单个大的接口好
调用者不应被迫依赖它用不到的方法
Client should not be forced to depend on methods it does not use.
5、依赖倒置原则 DIP
英文全称:Dependence Inversion Principle
面向抽象编程:接口或抽象类
- 每个类尽量有一个接口或抽象类。(任何类都不应该从具体类继承)
- 变量声明的class尽量是接口或者是抽象类。(使用继承时尽量遵循里氏替换原则)
抽象不应该依赖具体,具体应该依赖抽象。高层模块不应该依赖低层模块,两者都应该依赖抽象。
Abstractions should not depend on details. Details (concrete implementations) should depend on abstractions.
High-level modules should not import anything from low-level modules. Both should depend on abstractions.
6、合成复用原则 CRP
英文全称:Composite Reuse Principle
合成复用优先:相对于继承复用,优先使用合成复用
7、迪米特法则 DP
英文全称:Demeter Principle 也称最少知道原则LKP
只与直接朋友通信:出现在局部变量中的类不是直接朋友,出现字段、方法参数、方法返回值中的类是直接朋友。
一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。
设计原则关系
核心原则是单一职责原则 SRP
和开闭原则 OCP
UML 统一建模语言
- 全程:Unified Modeling Language
- 用途:一种可视化的软件设计工具。在学习面向对象、设计模式、阅读或撰写开发文档等使用
- 分类:类图、时序图等(用例图、对象图、状态图、活动图、协作图、构件图、部署图)
- 工具:ProcessOn、Visio等
类图 Class Diagram
描述类class、接口interface之间的:
- 静态层次结构:见"类、接口、对象、实例"
- 六大协作关系:见"类(接口)之间的关系"
(实例的)时序图 sequence diagram
描述程序工作时,参与实例的激活状态、实例方法的调用顺序
GoF的设计模式(23种)
起源
起源于1994年,由GoF出版《Design Patterns-Elements of Reusable Object-Oriented Software》
中文译名:《设计模式-可复用的面向对象软件元素》
该书提出了软件开发中23种设计模式
GoF,Gang of Four:Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides
模式的概念
设计模式(Design patterns):简称模式
- 目的:为了设计
可复用
的面向对象软件。为了应对将来大概率会发生的某种"需求变更",而提前准备的解决方案。 - 核心思想:设计原则
- 定义:对被用来在特定场景下解决一般设计问题的
类
和相互通信的对象
的描述
模式的四大基本要素
- 模式名称:模式名、分类、 2.别名
- 问题:1.意图
- 解决方案:3.动机、5.结构、6.参与者、7.协作、10.代码示例(所包含的类和实例,它们的角色、协作方式、职责分配)
- 效果:4.适用性、8.效果、9.实现(好处和代价)
找到相关对象→适当粒度归类→定义类的接口和继承层次→对象之间的基本关系
模式分类
按范围准则
分类:
- 类模式:处理类和子类之间的关系,通过继承建立,静态的,编译时确定
- 对象模式:处理对象间的关系,通过委托建立,动态的,运行时变化
按目的准则
分类:
模式分类 | 英文 | 类模式 | 对象模式 |
---|---|---|---|
创建型模式(5种) | Creational | 对象的部分创建工作,延迟到子类 | 对象的部分创建工作,延迟到另一个对象 |
结构型模式(7种) | Structural | 使用继承组装类 | 使用合成组装对象 |
行为型模式(11种) | Behavioral | 使用继承描述算法和控制流 | 一组对象协作完成任务 |
GoF的模式:复用方法,改变接口
使用旧API,实现新API
§4.1 适配器 Adapter
§4.2 桥接 Bridge
§4.5 外观 Facade
GoF的模式:复用方法,保持接口
持有同类引用,形成特殊结构
- 持有平辈:4.7.代理
- 持有父辈(单个):4.4.装饰器
- 持有父辈(多个):4.3.组合
- 持有自己:5.1.责任链
§4.7 代理 Proxy
§4.4 装饰器 Decorator
§4.3 组合 Composite
$5.1 责任链 Chain of Responsibility
GoF的模式:复用同一接口,扩展多种实现
§5.10 模板方法 Template Method
§5.08 状态 State
§5.09 策略 Strategy
GoF的模式:未归类
§3.1 抽象工厂 Abstract Factory
§3.2 建造者 Builder
§3.3 工厂方法 Factory Method
§3.4 原型 Prototype
§3.5 单例 Singleton
§4.6 享元 Flyweight
§5.2 命令 Command
§5.3 解释器 Interpreter
§5.4 迭代器 Iterator
§5.5 中介者 Mediator
§5.6 备忘录 Memento
§5.7 观察者 Observer
§5.11 访问者 Visitor
其他模式
过滤器 Filter、Criteria
空对象 Null Object
J2EE 模式
这些设计模式特别关注表示层。这些模式是由 Sun Java Center 鉴定的。