面向对象七项设计原则
-
开闭原则:
- 当应用的需求发生改变后,不需要更改源代码也可以扩展模块功能,使其满足新的需求。
- 实现方法:抽象约束,封装变化。将软件实体定义为一个相对稳定的抽象层,可变因素封装在相同的具体实现类中。
-
里氏替换原则:
- 主要是阐述有关继承的一些原则,子类可以扩展父类的功能,但不能改变父类原有的功能,尽量不进行重写,子类可以新添功能但不要重写。
- 实现方法:子类可以增加自己特有的方法,子类重载父类的方法时方法的前置条件要比父类宽松,方法的返回值要比父类严格或相等。
-
依赖倒置原则:
- 面向接口编码,而不是面向实现编程。使用接口或者抽象类的目的是制定好规范和契约而不去涉及任何具体的操作,展现细节的任务交给实现类完成。
- 实现方法:通过面向接口的编程来降低类间的耦合性。每个类都尽量提供接口或者抽象类或者两者都具备。变量的声明类型尽量是接口或者抽象类;任何类都不应该从具体类派生;使用继承时遵循里氏替换原则
-
单一职责原则:
- 一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分
- 实现方法:发现类的不同职责并将其分离,再封装到不同的类或模块中,需要能力较高。
-
接口隔离原则:
- 一个类对另一个的依赖应该建立在最小的接口上。接口一定要小而精
- 实现方法:接口尽量小,一个接口只服务于一个子模块或者业务逻辑;为依赖接口的类定制服务;提高内聚减少对外交互;
-
迪米特法则:
- 如果两个软件实体无需直接通信,那就不应该发生直接的相互调用。对象本身,当前对象的成员对象,当前对象所创建的对象、当前对象的方法参数等,与当前对象存在关联,聚合或组合关系可直接访问。慎重使用,避免出现太多中介类。
- 实现方法:只依赖应该依赖的对象;只暴露应该暴露的方法;降低类成员的访问权限;尽量将一个类设计为不变类;降低引用其他对象的次数;不暴露类的属性成员而提供相应的访问器(set和get);谨慎使用序列化功能。
-
合成复用原则:
- 软件复用时尽量先使用组合或者聚合等关联关系来实现,其次再考虑继承关系(严格遵循里氏替换原则)
- 实现方法:将已有对象纳入新对象中,作为新对象的成员对象来实现的,新对象可以调用已有对象的功能,从而达到复用。
这些原则的目的只有一个:降低对象之间的耦合,增加程序的可复用性、可扩展性和可维护性。