单一职责原则(SRP)
-
就一个类而言应该仅有一个引起它变化的原因
-
如果一个类承担的职责过多,就等于把这些职责耦合在一起,那么一个职责的变化就可能会削弱或者抑制这个类完成其他职责的能力
-
难点在于如何区分职责,职责的粒度问题
单一职责适用于:
接口,类,方法
开放封闭原则(OCP):
一个软件实体应当对外扩展开放,对修改关闭
关键:
-
合理地抽象,分离出变化与不变化的部分,为变化的部分预留下可扩展的方式,例如钩子方法或者动态组合对象
-
完全遵守开闭原则是不可能的,也没有这个必要
什么叫做钩子方法?
是对于抽象方法或者接口中定义的方法的一个空实现
在实际的运用中,例如有一个接口,这个接口里面有7个方法,而你只想用其中的一个方法,那么这时,你可以写一个抽象类实现这个接口,在这个抽象类里将你要用的那个方法设置为abstract,其他方法进行空实现,然后再继承这个抽象类,就不需要实现它不需要的方法
里氏代换原则:
子类型必须能够替换他们的基类型。子类可以以父类的身份出现
依赖倒转原则(DIP):
要依赖于抽象,不依赖于具体
也就是说依赖倒转原则要求客户端依赖于抽象耦合。
-
抽象不应当依赖于具体实现;具体实现应当依赖于抽象
-
高层模块不应当依赖于底层,两者都应该依赖于抽象
-
针对接口编程,不针对实现编程
好莱坞原则:“Don't call me;I'll call you”
用一个例子来说明就是:乘客(you)打的,沿途问司机(me)某个景点,天经地义;但是,乘客(you)不要从上车的第一秒开始时时刻刻问司机到了没有,应该是到了目的地后司机通知你
me指的是下层模块
核心就是以通知代替轮询
合成/聚合复用原则
要尽量使用合成/聚合,而不是继承关系达到复用的目的。
接口隔离原则(ISP):
使用多个专门的接口比使用单一的总接口要好,也就是说,从一个客户类的角度来讲,一个类对另一个类的依赖性应当是建立在最小接口上
实现方法:
使用多重继承分离接口
迪米特法则(LoD):
又叫做最少知识原则,如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用
也就说说,一个对象应当对其他对象有尽可能少的了解
-
根本思想就是强调了类之间的松耦合
-
类的耦合越弱,越有利于复用,一个处于弱耦合的类被修改,不会对有关系的类造成波及
-
信息的隐藏促进了软件的复用
总结: