1. 什么是模式?
模式化的过程是把问题抽象化,在忽略掉不重要的细节后,发现问题的一般性本质,并找到普遍适用的解决方案的过程。
2. 好的系统应该具有的性质
- 可扩展性
- 灵活性
- 可插入性
3. 开闭原则 (OCP)
一个软件实体应该对扩展开放,对修改封闭
对可变性的封装原则: 找到一个系统的可变因素,将其封装起来
继承
继承应当被看做是封装变化的方法,而不应当被认为是从一般的对象生成特殊的对象的方法。
与里氏替换原则的关系
(1)里氏替换:任何基类可以出现的地方,子类一定可以出现。
(2)里氏替换原则是对开闭原则的补充。
实现开闭原则的关键步骤是抽象化。
基类与子类的继承关系就是抽象化的具体体现。
里氏替换是对实现抽象化的具体步骤的规范。
(3)违背里氏替换原则的也违背开闭原则,反之不然。
与依赖倒转原则的关系
(1) 依赖倒转: 要依赖于抽象,不要依赖于实现
(2) 开闭原则是目标,依赖倒转是手段
与合成/聚合复用原则的关系
(1) 合成/聚合复用原则:要尽量使用合成/聚合,而不是继承关系达到目的
(2) 合成/聚合复用原则 与 里氏替换原则 是相辅相成的
(3) 与里氏替换原则一样,是对实现抽象化的具体步骤的规范
(4) 是实现开闭原则的必要条件,如果违法这一原则,系统就无法实现开闭原则。
与迪米特法则的关系
(1) 一个软件实体应当尽可能少的与其他实体发生相互作用。
(2) 迪米特法则容易做到对修改的封闭,是一条通向开闭原则的道路。
与合成/聚合复用原则的关系
(1) 合成/聚合复用原则: 应当为客户端提供尽可能小的单独的接口,而不是提供大的总接口。
(2) 限制了通信的宽度,不会将修改的压力传递到其他的对象。
4. 接口
4.1 可插入性构件
关键在于存在一个公用的接口,以及每个构件都实现了这个接口。
4.2 接口
接口是实现可插入性构件的关键。
接口把方法的特征和方法的实现分割开来。
接口通常代表一个角色(Role), 它包含与该角色相关的操作与属性,而实现这个接口的类便是扮演这个角色的演员。
接口提供了关联以及方法调用上 的可插入性。
5. 抽象类
(1)抽象类可以同时有抽象方法和具体方法。
(2)抽象类一定是用来继承的,只要有可能,不要从具体类继承。
(3)IS-A关系才符合继承关系,Has-A 关系符合聚合关系。
6. 里氏替换原则 (LSP)
一个软件实体如果使用的是其基类的话,那么一定适用于其子类,而它根本不能察觉出基类对象和子类对象的区别。
里氏替换原则是继承复用的基石。
7. 依赖倒转原则(DIP)
要依赖于抽象,不依赖于具体。要针对接口编程,不针对实现编程。
开闭原则是面向对象设计的目标,依赖倒转原则是面向对象设计的主要机制。
7.1 三种耦合关系
- 零关系耦合
- 具体耦合
- 抽象耦合
8.接口隔离原则(ISP)
使用多个专门的接口比使用单一的总接口要好
一个接口应当简单的代表一种角色(单一责任原则)
9. 合成/聚合复用原则 (CARP)
要尽量使用合成/聚合,尽量不要使用继承。
9.1 合成
合成表示拥有关系或者整体与部分的关系
9.2 聚合
聚合也表示整体与部分的关系,但是部分与整体的生命周期是一样的。
9.3 Has-A 和 Is-A
如果两个类的关系是Has-A, 那么这两个类一定违反里氏替换原则。
只有两个类符合里氏替换原则,才有可能是Is-A关系。
10. 迪米特法则(LoD Low Of Demeter)
又叫最少知识原则,一个对象应当对其他对象有尽可能少的了解。
一个对象仅仅与其朋友发生相互作用。
11. SOLID原则 总结
缩写 | 全程 | 中文 |
---|---|---|
S | The Single Responsibility Principle | 单一责任原则 |
O | The Open Closed Principle | 开放封闭原则 |
L | Liskov Substitution Principle | 里氏替换原则 |
I | The Interface Segregation Principle | 接口分离原则 |
D | The Dependency Inversion Principle | 依赖倒置原则 |
网友评论