1.开闭原则(open close principle)
定义:对扩展开放,对修改关闭。
当应用需求改变时,在不修改软件实体的源代码或者二进制的前提下,可以扩展该模块的功能,以满足新的需求。
方法:抽象约束,封装变化
通过接口或者抽象类定义相对稳定的抽象层,而将相同的可变因素封装在相同的具体实现类中。
2.里氏代换原则(liskov substitution principle LSP)
定义:继承的原则—继承必须确保超类所拥有的性质在子类中仍然成立。任何基类可以出现的地方,子类一定可以出现。
方法:子类可以扩展父类的功能,但不能改变父类原有的功能。即尽量不要重写父类的方法。
1.子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法
2.子类中可以增加自己特有的方法
3.当子类的方法重载父类的方法时,方法的前置条件(即方法的输入参数)要比父类的方法更宽松
4.当子类的方法实现父类的方法时,方法的后置条件(即方法的返回值)要比父类的方法更严格或相等
3.依赖倒置原则(dependence inversion principle)
定义:高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。核心思想表现为:面向接口编程,依赖于抽象而不依赖于具体。
方法:面向接口编程
1.每个类尽量提供接口或者抽象类,或者两者都具备
2.变量的生命类型尽量是接口或者是抽象类。
3.任何类都不应该从具体类派生。
4.使用继承时尽量遵循里氏替换原则
4.单一职责原则(single responsibility principle)
定义:规定一个类应该有且仅有一个引起它变化的原因。它要求控制类的粒度大小,将对象解耦,提高其内聚性。
单一职责原则同样适用于方法。一个方法应尽可能做好一件事情。
5.接口隔离原则(interface segregation principle)
定义:将臃肿庞大的接口拆分成更小和更具体的接口。任何类不应该被迫依赖于它不使用的方法。
实现:为各个类建立他们需要的专用接口,不要试图建立一个庞大的接口供所有依赖它的类去调用。
1.接口尽量小,但是要有限度。一个接口只服务于一个子模块或者业务逻辑。
2.为依赖接口的类定制服务。只提供调用者需要的方法,屏蔽不需要的方法。
3.提高内聚,减少对外交互。使接口用最少的方法完成最多的事情。
6.迪米特法则(最少知道原则)(demeter principle)
定义:只与你的直接朋友交谈,不跟陌生人说话。一个实体应当尽量少的与其他实体之间发生直接的相互作用,可以通过第三方转发该调用,使得系统功能模块相对独立。
一个对象应该对其它对象保持最少的了解。
1.从依赖着的角度来说,只依赖应该依赖的对象
2.从被依赖的角度来说,只暴露应该暴露的方法。
7.合成复用原则(composite reuse principle)
定义:复用时,尽量使用组合、聚合等关联关系来实现,而不是使用继承。
继承复用破坏了类的封装行。因为继承会将父类的实现细节暴露给子类,父类对子类是透明的,所以这种复用又称为“白箱”复用。耦合度高,限制了复用的灵活性。
方法:将已有的对象纳入新对象中,作为新对象的成员对象来实现。新对象可以调用已有对象的功能,从而达到复用。