面向对象的六大原则
面向对象设计的原则是面向对象思想的提炼,它比面向对象思想的核心要素更具可操作性,但与设计模式相比,却又更加的抽象,是设计精神要义的抽象概括。形象地讲,面向对象思想像法理的精神,设计原则则相对于基本宪法,而设计模式就好比各式各样的具体法律条文了。
面向对象设计原则一般有六大原则,分别是:单一职责原则,开闭原则,里氏替换原则,依赖倒置原则,接口隔离原则,迪米特原则。
单一职责原则
单一职责原则的英文名称是Single Responsibility Principle,缩写是SRP。单一职责原则的定义是:There should never be more than one reason for a class to change.(不要存在多于一个导致类变更的原因)。通俗来讲就是一个类只负责一个职责。
下面看一个设计示例,打电话的时候会有四个过程发生:拨号,通话,回应,挂机。现在写一个接口如下图所示
接口代码如下
Iphone这个接口表面看上去没什么问题,但是它违背了单一职责原则。分析这个接口,Iphone包含了两个职责:第一个是协议管理,第二个是数据传输。dial()和hangup()两个方法表示协议管理,负责拨号和挂机;chat()方法表示的是数据的传输,负责把语音与传输信号进行转换。这样一来,数据传输如果变化了会引起这个接口的实现类的变化,也就影响到了协议管理的实现,反之亦然,那么这两个职责之间就会相互影响。我们应该想达到的目标是:拨号应该接通就可以了,不管是哪家的协议;电话连接后也不关心传递什么数据了。现在我们考虑拆分成两个接口,如下图所示
这样一改就满足了单一职责的要求,每个接口都是职责分明,结构清晰,但是这样的话,Phone类需要把ConnectionManager和DataTransfer两个实现类组合在一起才能使用。组合产生了一种强耦合关系,还增加了类的实现复杂性,多了两个类。再修改一次,这次Phone类实现了两个接口,虽然两个职责融合在一个类中,但是我们对外公布的是接口而不是实现类,通过面向接口编程这种方式使得结构简洁清晰、职责分明。
单一职责原则的好处
- 类的复杂性降低,实现什么职责都有清晰明确的定义;
- 可读性提高,复杂性降低,那当然可读性提高了;
- 可维护性提高,可读性提高,那当然更容易维护了;
- 变更引起的风险降低,变更是必不可少的,如果接口的单一职责做得好,一个接口修改只对相应的实现类有影响,对其他的接口无影响,这对系统的扩展性、维护性都有非常大的帮助。