所谓单一职责原则就是一个类仅有一个引起它变化的原因。这里变化的原因就是所说的“职责”。如果一个类有多个引起它变化的原因,那么也就意味着这个类有多个职责,再进一步说,就是把多个职责耦合在一起了。
所谓开放-闭合原则,指的是,一个类应该对扩展开放,最修改关闭。一般也被简称开闭原则,开闭原则是设计中非常核心的一个原则。 开闭原则要求的是,类的行为是可以扩展的,而且是在不修改已有代码的情况下进行扩展,也不必改动已有的源代码或者二进制代码。 实现开闭原则的关键就在于合理地抽象、分离出变化和不变化的部分,为变化的部分留下可扩展的方式,比如,钩子方法或者是动态组合对象等。 这个原则看起来也很简单。但事实上,一个系统要全部做到遵守开闭原则,几乎是不可能的,也没这个必要。适度的抽象可以提高系统的灵活性,使其可扩展、可维护,但是过度的抽象,会大大的增加系统的复杂程度。应该在需要改变的地方应用开闭原则就可以了,而不用到处使用,从而陷入过度设计。
子类型(subtype)必须能够替换它们的基(父)类型。(子类可以以父类的身份出现)。 比如,如果是父类是鸟,鸟会飞。企鹅?不会飞,企鹅是鸟吗?所以企鹅不能继承鸟这个类。
所谓依赖倒置原则,指的是,要依赖于抽象,不要依赖于具体类。要做到依赖倒置,典型的应用应该做到:
因此,这个底层的接口与应该由高层提出的,然后由底层实现的,也就是说底层接口的所有权在高层模块,因此是一种所有权的倒置。
启示:好的程序应该强内聚,松耦合。
这个原则用来指导我们在设计系统的时候,应该尽量减少对象之间的交互,对象只和自己的朋友谈话,也就是只和自己的朋友交互,从而松散类之间的耦合。通过松散类之间的耦合来降低类之间的相互依赖,这样在修改系统的某一个部分的时候,就不会影响其他的部分,从而使得系统具有更好的维护性。
那么哪些对象才能当做朋友呢?
其根本思想:
接口隔离原则(Interface Segregation Principle)讲的是:使用多个专门的接口比使用单一的总接口要好。换而言之,从一个客户类的角度来讲:一个类对另外一个类的依赖性应当是建立在最小接口上的。
过于臃肿的接口是对接口的污染。不提倡使用,也不应该是用Dirt Interface。
要尽量使用合成/聚合,而不是继承关系达到复用的目的。
合成/聚合原则就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过向这些对象的委派达到复用已有。