一、OOP设计原则
1、开闭原则:OCP(open close principle)
类、模块、函数等对扩展开放,对修改关闭;这是最重要也是最为抽象的原则,其他的原则也是对它的实现提供了路径。
2 、单一职责原则:SRP(single responsibility principle)
有且只有一个原因引起类的变更;一个类的功能尽量单一,降低耦合。
3、里氏替换原则:LSP(liskov substitution principle)
很严格的原则,规则是“子类必须能够替换基类,否则不应当设计为其子类。”也就是说,子类只能去扩展基类,而不是隐藏或覆盖基类。
这条原则包含以下几个方面:
- 子类必须完全实现父类的方法
- 子类可以有自己的个性外观(属性)和行为(方法)
- 覆盖或者实现父类方法时,参数可以被放大。即父类的某个方法参数为HashMap时,子类参数可以是HashMap,也可以是Map或者更大
- 覆盖或者实现父类的方法时,返回结果可以被缩小。即父类的某个方法返回类型是Map,子类可以是Map,也可以是HashMap或者更小。
4、依赖倒置原则:DIP(dependence inversion principle)
高层模块不要依赖低层模块,所有依赖都应该是抽象的,抽象不应该依赖于具体细节,具体细节应该依赖于抽象。设计要依赖于抽象而不是具体化。
该原则包含以下几点要素:
- 模块间的依赖应该通过抽象发生,具体实现类之间不应该建立依赖关系
- 接口或者抽象类不依赖于实现类,否则就失去了抽象的意义
- 实现类依赖于接口或者抽象类
总结起来,一句话:”面向接口编程“。
5、接口隔离原则:ISP(Interface-Segregation Principle)
接口功能单一,避免接口污染。类间的依赖应该建立在最小的接口上
通俗点讲:使用接口时应该建立多个单一接口,不要建立一个臃肿庞大的多功能接口。
6、迪米特法则:LoD(Low of Demeter)
也叫“最少知识原则”,一个对象应当尽可能少的去了解其他对象。如果两个类不必彼此直接通信,那么他们就不不应该发生直接的相互作用。如果其中一个类需要调用另一个列的的某一个方法。可以通过第三者转发这个调用。
通俗点讲:一个类应该对自己需要耦合或者调用的类知道越少越好,被耦合或者调用的类内部和我没有关系,我不需要的东西你就别public了吧。
迪米特法则包含以下几点要素:
- 只和朋友类交流:只耦合该耦合的类
- 朋友间也是有距离的:减少不该public的方法,向外提供一个简洁的访问
- 自家的方法就自己创建:只要该方法不会增加内部的负担,也不会增加类间耦合
二、模式分类
1、按照目的来分(广泛使用)
- -创建型(Creational)模式:负责对象的创建
- -结构型(Structural)模式:处理类与对象间的组合关系
-
-行为型(Behavioral)模式:类与对象交互中的职责分配的问题
2、按照范围来分:
- -类模式处理类与子类的静态关系
- -对象模式处理对象间的动态关系
三、推荐参考书
《设计模式:可复用面向对象软件的基础》 GoF
《面向对象分析与设计》 Grady Booch
《敏捷软件开发:原则、模式与实践》 Robert C.Martin
《重构:改善既有代码的设计》 Martin Fowler
《Refactoring to Patterns》 Joshua Kerievsky