设计原则学习笔记
目录
- 单一职责原则(SRP)
- 开闭原则(Open Closed Principle OCP)
- 里氏替换原则(Liskov Substitution Principle LSP)
- 依赖倒置原则(Dependency Inversion Principle DIP)
- 接口隔离原则(Interface Segregation Principle ISP)
- 迪米特法则(Demter Principle)
- 合成复用原则(Composite Reuse Principle)
1.单一职责原则(SRP)
系统中的每一个对象都应该只有一个单独的职责,而所有对象所关注的就是自身职责的完成。
每一个职责都是一个设计的原因,需求变化的时候,需求变化反映为类职责的变化。当系统里面的对象都只有一个变化的原因的时候,你就已经很好的遵循了单一职责了。
单一职责可以是类级别的单一,也可以是行为上的单一。
2.开闭原则(Open Closed Principle OCP)
一个模块在扩展性方面应该是开放的,而在更改性方面应该是封闭的。因此在进行面向对象设计时要尽量考虑接口封装机制、抽象机制和多态技术。该原则同样适合于非面向对象设计的方法,是设计方法的重要原则之一。
3.里氏替换原则(Liskov Substitution Principle LSP)
任何基类可以出现的地方,子类一定亦可以出现。里氏替换原则是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能部受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏替换原则是对 "开闭原则" 的补充。实现 "开闭原则" 的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏替换原则是对实现抽象化的具体步骤的规范。
4.依赖倒置原则
在进行业务设计时,与特定业务有关的依赖关系应该尽量依赖接口和抽象类,而不是依赖于具体类。具体类只负责相关业务的实现,修改具体类不影响与特定业务有关的依赖关系。
在结构化设计中,我们可以看到底层的模块是对高层抽象模块的实现(高层抽象模块通过调用底层模块),这说明,抽象的模块要依赖具体实现相关的模块,底层模块的具体实现发生变动时将会严重影响高层抽象的模块,显然者是结构化方法的一个 "硬伤"。
面向对象方法的依赖关系刚好相反,具体实现类依赖与抽象和接口。为此我们在进行业务设计时,应尽量在接口或抽象类中定义业务方法的原型,并通过具体的实现类去实现该业务方法,业务方法内容的改变将不会影响到运行时业务方法的调用。
5.接口隔离原则(Interface Segregation Principle ISP)
使用多个隔离的接口,比使用单个接口要好。
不要让一个单一个接口承担过多的职责,而应该把每个职责分离到多个专门的接口中,进行接口隔离。
6.迪米特法则(Demter Principle)
一个模块或对象应该尽量少的与其它实体之间发生相互作用,使得系统功能模块相对独立,者杨当一个模块修改时,影响的模块就会越少,扩展起来更加容易。
关于迪米特法则的其它描述:只与你直接的朋友们通讯;不要跟 "陌生人" 通讯(外观模式和中介者模式就使用了迪米特法则)。
7.合成复用原则(Composite Reuse Principle)
合成复用原则是指在一个新的对象里通过关联关系来使用一些已有的对象,使之成为新对象的一部分;新对象通过委派调用已有对象的方法达到复用其以及由功能的目的。
简言之:要尽量使用组合/聚合关系,少用继承。