六个设计原则
一、单一职责原则
(Single Responsibility Principle)
There should never be more than one reason for a class to change.
意思说:一个类,应当只有一个引起它变化的原因;即一个类应该只有一个职责。类的职责越少,则对象之间的依赖关系就越少,耦合度就越低。
单一职责模式例子如下:
二、里氏替换原则
(Liskov Substitution Principle)
Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it.
意思是说:所有引用父类的地方必须能透明地地使用其子类对象。更明确地说只要父类出现的地方子类就可以出现,而且替换为子类不会发生任何异常。
只有当子类可以替换掉父类,软件的功能不受到影响时,父类才能真正被复用。
里氏替换原则为良好的继承定义了一个规范 ,包含4层含义:
- 子类必须完全实现父类的方法
- 子类可以有自己导弹个性
- 覆盖或实现父类的方法时输入参数可以被放大
- 覆盖和实现父类的方法时输出结果可以被缩小
注:按照里氏替换规则,除非要使用子类的个性方法,通常应该使用父类或接口来指向子类的对象。
三、依赖倒置原则
(Dependence Inversion Principle)
High level modules shoule not depend on low level modules.Both shoule depend on abstractions.Abstractions should not depend on details.Details shoule depend on abstractions.
高层模块不应该依赖低层模块,两者都应该依赖其抽象。
抽象不依赖细节
细节应该依赖抽象
在Java中的体现:“面向接口编程”。
一个例子如下:
注意:在Java中,一个变量可以有两种类型,表面类型和实际类型。
实际开发中要遵守以下原则:
- 每个类都要有抽象类或接口,有抽象才有依赖倒置
- 变量的表面类型尽量是接口类型或抽象类型
- 任何类都不应该从具体类导出
- 尽量不要重写父类的方法。重写了非抽象方法对依赖的稳定性产生一定影响。
- 结合里氏替换可以可到一个通俗规则:接口负责定义抽象方法,并且声明与其他对象的依赖关系(方法参数和返回值类型),抽象类负责公共构造部分的实现,实现类对父类进行细化。
依赖倒置可以说是面向对象的标志,如果编写时考虑的都是针对抽象编程而不是针对细节编程,即程序中所有的依赖关系都终止于抽象类或接口,那就是面向对象设计。
四、接口隔离原则
(Interface Segregation Principle)
- Clients should not be forced to depend on interfaces that they don’t use.
- The dependency of one class to another one shoule depend on the smallest possible interface.
接口隔离原则的应用:
五、迪米特法则
(Law of Demeter)or (Least KnowLedge Principle最少知识原则)
- only talk to your immediate friends.
- Don’t talk to strangers.
反例:
自己 ---> 朋友 --> 陌生人
| ^
|-------------------|
talk to the stranger!!
正例:
六、开闭原则
(Open-Closed Principle) 简称OCP
Software entities should be open for extension , but closed for modification.
面对需求,对程序的改动是通过增加新代码进行的,而不是更改现有的代码。开发人员应该尽早地对频繁变化的部分创建正确的抽象。
例子: