面向对象设计的七大设计原则详解

面向对象设计的七大设计原则详解

面向对象的七大设计原则

简述

类的设计原则有七个,包括:开闭原则里氏代换原则迪米特原则(最少知道原则)单一职责原则接口分隔原则依赖倒置原则组合/聚合复用原则

七大原则之间的关系
七大原则之间并不是相互孤立的,彼此间存在着一定关联,一个可以是另一个原则的加强或是基础。违反其中的某一个,可能同时违反了其余的原则。

开闭原则是面向对象的可复用设计的基石。其他设计原则是实现开闭原则的手段和工具。

一般地,可以把这七个原则分成了以下两个部分:

设计目标:开闭原则、里氏代换原则、迪米特原则
设计方法:单一职责原则、接口分隔原则、依赖倒置原则、组合/聚合复用原则

单一职责

什么是职责

在 The Single Responsibility Principle(SRP) 中职责的定义为“变动的原因”(A reason for change)

如果你有多个动机去修改一个类,那么这个类就有多个职责。这可能比较难理解,因为我们通常把一组职责放在一起思考,下面来看一个具体的例子。下面是一个 Modem(调制解调器或者叫猫)的接口

interface Modem {
   
    public void dial(String pno);
    public void hangup();
    public void send(char c);
    public char recv();
}

上面这个猫的接口中存在两个职责:第一个是管理连接(dial和hangup);第二个是数据传输(send和recv)。这两个职责应该被分开,因为 :

  1. 它们没有共同点,而且通常会因为不同的原因被修改;

  2. 调用它们的代码通常属于应用的不同部分,而这部分代码也会因为不同的原因被修改。

下面是一个 Modem 优化后的设计:

面向对象设计的七大设计原则详解_第1张图片

通过拆分猫的接口,我们可以在应用的其他部分将猫的设计分开来对待。虽然我们又在猫的实现中(Modem Implementation)将这两部分职责重新耦合在一起,但是除了初始化猫的代码以外,在使用面向接口编程的原则后,其他代码并不需要依赖于猫的实现。

SRP 是最简单的一个面向对象设计原则,但也是最难做正确的一个,因为我们习惯于将职责合并,而不是将它们分开来。找到并且拆分这些职责正是软件设计真正需要做的事情。

小结

核心思想:应该有且仅有一个原因引起类的变更

好处:类的复杂度降低、可读性提高、可维护性提高、扩展性提高、降低了变更引起的风险。

需注意:单一职责原则提出了一个编写程序的标准,用“职责”或“变化原因”来衡量接口或类设计得是否优良,但是“职责”和“变化原因”都是不可以度量的,因项目和环境而异。

开闭原则

开闭原则的英文是 Open Closed Principle,缩写为 OCP。

开闭原则说的是:

软件实体(模块、类、函数等等)应该对扩展是开放的,对修改是关闭的

  • 对扩展是开放的,意味着软件实体的行为是可扩展的,当需求变更的时候,可以对模块进行扩展,使其满足需求变更的要求。

  • 对修改是关闭的,意味着当对软件实体进行扩展的时候,不需要改动当前的软件实体;不需要修改代码;对于已经完成的类文件不需要重新编辑;对于已经编译打包好的模块,不需要再重新编译。

两者结合起来表述为:添加一个新的功能应该是,在已有代码基础上扩展代码(新增模块、类、方法等),而非修改已有代码(修改模块、类、方法等)。

这里我们以出售电脑为例,首先定义一个顶层接口 Computer,然后定义两个实现类,华硕电脑与苹果 Mac,类层次结构如下图所示:

面向对象设计的七大设计原则详解_第2张图片

上面是我们一开始的需求,但是随着软件发布运行,我们的需求不可能一成不变,肯定要接轨市场。假设现在是双十一,华硕笔记本电脑需要搞促销活动。那么我们的代码肯定要添加新的功能。可能有些刚入职的新人会在原有的代码上做改动,这肯定不符合开闭原则,虽然这种做法最直接,也最简单,但是绝大部分项目中,一个功能的实现远比想像要复杂的多,我们在原有的

你可能感兴趣的:(设计模式,java,设计模式)