> 文章列表 > 【设计模式】软件开发原则

【设计模式】软件开发原则

【设计模式】软件开发原则

软件开发原则

  • 0. 软件开发原则的作用
  • 1. 开闭原则
  • 2.里氏代换原则
  • 3. 依赖倒转原则
  • 4. 接口隔离原则
  • 5.迪米特原则
  • 6. 合成复用原则
  • 总结归纳

0. 软件开发原则的作用

在软件开发中,为了提高软件开发的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽可能的遵循一下6条原则来开发程序,从而提高软件开发效率、节约软件开发成本和维护成本。

1. 开闭原则

开闭原则:对扩展开放,对修改关闭

在编码过程中,想要达到上面的效果,我们就得灵活使用接口和抽象类。

我们以 手机的主题 为例来介绍开闭原则:

  1. 手机的主题是用户可以根据自己的喜好更换,或者去网上下载,这些主题有一些共同的特点,我们可以将它们抽象出来,定义为一个抽象类,而每个具体的皮肤都是它的子类。
  2. 这样,用户就可以在不修改原来代码的情况下添加主题,并根据需求选择主题。

【设计模式】软件开发原则

2.里氏代换原则

里氏代换原则:子类可以扩展父类的功能,但是不能改变父类原有的功能。换句话说就是:子类在继承父类时,可以添加新的功能,但是尽量不要重写父类的方法

通过重写父类方法来完成新的功能,这种方法虽然写起来比较简单,但是整个继承体系的可复用性就会比较差,特别是运用多态时就会比较复杂,程序出错的概率就会变大。

著名的例子就是:正方形不是长方形(可以百度一下)

3. 依赖倒转原则

依赖倒转原则:

  1. 高层模块不应该依赖低层模块,两者都应该依赖其抽象。
  2. 抽象不应该依赖与细节,细节应该依赖于抽象。

简单的说就是要求对抽象进行编程,不要对实现进行编程

【例】组装电脑

现要组装一台电脑,需要配件cpu,硬盘,内存条。只有这些配置都有了,计算机才能正常的运行。选择cpu有很多选择,如Intel,AMD等,硬盘可以选择希捷,西数等,内存条可以选择金士顿,海盗船等。

类图如下:
【设计模式】软件开发原则

这种设计方法看似设计了一台完整的电脑,但是似乎组装的电脑的cpu只能是Intel的,内存条只能是金士顿的,硬盘只能是希捷的。这样的Computer类使用起来并不灵活,当他要装一个别的类型的内存条时,它是不能直接装的,得修改Computer里面得代码才能装。

根据依赖倒转原则进行改进:
代码我们只需要修改Computer类,让Computer类依赖抽象(各个配件的接口),而不是依赖于各个组件具体的实现类。

【设计模式】软件开发原则

这样设计之后,这台Computer就可以装各种类型的硬盘,各种类型的内存条,以及各种类型的cpu。

4. 接口隔离原则

接口隔离原则:一个接口里面只出现一个抽象方法

  1. 客户端不应该被迫依赖于它不使用的方法;
  2. 一个类对另一个类的依赖关系应该建立在最小的接口上。

【例】安全门的例子
我们需要创建一个 品牌的安全门,该安全门具有防火、防水、防盗的功能。可以将防火,防水,防盗功能提取成一个接口,形成一套规范。类图如下:【设计模式】软件开发原则
这样设计之后,该品牌的安全门具备了防盗,防水,防火的功能。但是,此时我们要想设计一个具备防盗,防水功能的防盗门品牌,此时实现SafeDoor就不行了,这就背离了接口隔离原则。我们应该这样设计:
【设计模式】软件开发原则

5.迪米特原则

迪米特原则:只和你的直接朋友交谈,不跟“陌生人”说话

  1. 如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性
  2. 迪米特法则中的“朋友”是指:当前对象本身、当前对象的成员对象、当前对象所创建的对象、当前对象的方法参数等,这些对象同当前对象存在关联、聚合或组合关系,可以直接访问这些对象的方法

【例】明星与经纪人的关系实例
明星由于全身心投入艺术,所以许多日常事务由经纪人负责处理,如和粉丝的见面会,和媒体公司的业务洽淡等。这里的经纪人是明星的朋友,而粉丝和媒体公司是陌生人,所以适合使用迪米特法则,类图如下:
【设计模式】软件开发原则

6. 合成复用原则

合成复用原则:先尽量使用联合或者聚合关系来实现,其次再考虑使用继承关系来实现。

继承复用虽然使用简单且容易实现,但是它还存在如下缺点:

  1. 继承破坏了类的封装性。因为继承会将父类的实现细节暴漏给子类,父类对子类是透明的,所以这种复用又叫做”白箱“复用。
  2. 子类与父类的耦合度高。父类的实现任何变化都会影响子类,这不利于类的扩展。
  3. 它限制了类的复用性。从父类继承而来是静态实现的,在编译时已经定义,所以运行时不能发生变化。

采用组合或者聚合复用时,可以将已有对象纳入到新对象当中,使之成为新对象的一部分,新对象可以调用已有对象的功能,他有如下优点:

  1. 它维持了类的封装性。已有对象实现的细节对于新对象来看,是不可见的,这种复用又叫做”黑箱“复用。
  2. 对象的耦合度低,可以在类的成员位置声明抽象。
  3. 复用的灵活性高。这种复用可以在运行时动态进行,新对象可以动态地引用与成分对象类型相同的对象。

【例】汽车分类管理系统
汽车按“动力源”划分可分为汽油汽车、电动汽车等;按“颜色”划分可分为白色汽车、黑色汽车和红色汽车等。如果同时考虑这两种分类,其组合就很多。类图如下:
【设计模式】软件开发原则
从上面类图我们可以看到使用继承复用产生了很多子类,如果现在又有新的动力源或者新的颜色的话,就需要再定义新的类。我们试着将继承复用改为聚合复用看一下。
【设计模式】软件开发原则

总结归纳

  1. 开闭原则:对扩展开放,对修改关闭
  2. 里氏代换原则:子类在继承父类时,可以添加新的功能,但是尽量不要重写父类的方法
  3. 依赖倒转原则:要求对抽象进行编程,不要对实现进行编程
  4. 接口隔离原则:一个接口里面只出现一个抽象方法
  5. 迪米特原则:只和你的直接朋友交谈,不跟“陌生人”说话
  6. 合成复用原则:先尽量使用联合或者聚合关系来实现,其次再考虑使用继承关系来实现。

服务器知识