面向对象的设计原则(设计模式中的7板斧)
设计模式中总共有23中基本的设计模式,让我们了解如何去“封装变化”,“对象间松散耦合”,“针对接口编程”,从而去设计出易维护、易扩展、易复用、灵活性好的程序。不过,也有7种规范我们行为的原则:
- 单一职责原则
- 开放封闭原则
- 里氏代换原则
- 依赖倒转原则
- 迪米特法则
- 合成聚合原则
- 接口隔离原则
一、单一职责原则
1.单一职责原则(SRP):就一个类而言,应该仅有一个引起它变化的原因。
2.如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力,这种耦合会导致脆弱的设计,当变化发生时,设计会遭到严重性的破坏。
3.软件设计真正要做的许多内容,就是发现职责并把那些职责互相分离。如果你能想到多于一个动机去改变一个类,那么这个类就具备多个职责,这是就应该去分离类的职责。
二、开放封闭原则
1.开放封闭原则(ASD):软件实体(类、模块、函数等等)应该可以扩展,但不可以修改。换句话说就是,对于扩展是开放的,对于修改是封闭的。
2.在设计出系统后可以保持稳定,从而使得系统可以在第一个版本以后(以之前版本为基础)不断推出新的版本。
3.无论模块是多么的“封闭”,都会存在一些无法对之封闭的变化。这就要求设计人员寻找到最有可能变化的位置,然后构造抽象来隔离那些变化。
4.对于应用程序中的每个部分都刻意的进行抽象并不是一个好的主意,拒绝不成熟的抽象和抽象本身一样重要。
三、里氏代换原则
1.里氏代换原则(LSP):子类型必须能替换掉它们的父类型(在软件里,把父类都替换为它的子类,程序的行为没有变化)——使开放封闭称为可能。
2.子类可以替换掉父类,软件单位的功能不受到影响时,父类才能真正被复用,而子类也能够在父类的基础上增加新的行为。
四、依赖倒转原则
1.依赖倒转原则(ASD):高层模块不应该依赖于底层模块,两个都应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。(依赖于抽象,而不依赖于具体)
2.针对接口编程,不要对实现编程。
3.依赖倒转可以说是面向对象的标志,如果编写时考虑的都是如何针对抽象变成而不是针对细节编程,那这就是面向对象的设计。
五、迪米特法则
1.迪米特法则(LoD):如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的方法的话,可以通过第三者转发这个调用。
2.根本思想是强调类之间的松耦合。
3.类之间的耦合越弱,越有利于复用,一个处于弱耦合的类被修改,不会对有关系的类造成波及。
六、合成聚合原则
1.合成聚合原则(CARP):在一个新的对象里面使用已有的对象,使之成为新对象的一部分,新的对象通过向这些对象的委派达到复用已有功能的目的。
2.新对象对组成对象的内部实现不知,每个新对象可以将功能聚集在一个点上,可以在运行时动态更新,动态的引用与组成对象类型相同的对象。
3.要尽量使用合成聚合,而不是继承关系达到复用的目的。
七、接口隔离原则
1.接口隔离原则(ISP):使用多个专门的接口比使用单一的总接口要好。
2.一个接口代表一个角色,不应当将不同的角色都交给一个接口。没有关系的接口合并在一起,形成一个臃肿的大接口,这是对角色和接口的污染。
3.一个类对另外一个类的依赖性应当是建立在最小的接口上。