编程为什么要使用设计模式?使用设计模式的好处有哪些?

  • Post author:
  • Post category:其他




1、 编写什么样的软件?

我们编写的代码除了要实现基本的功能之外,我们肯定希望代码不仅实现了基本的功能,还具有如下优点:

  • 代码结构清晰、易于理解
  • 代码易于易于维护
  • 代码功能容易扩展
  • 良好的复用性以及可移植性
  • ……



1.1 高内聚、低耦合

一般来说,良好的代码应该具有两大基本特点:

高内聚、低耦合



高内聚

是指代码的模块内部联系紧密,可以很好的地实现一个功能;

低耦合

是指模块之间的依赖很小,一个模块的改动,对其它模块的没有影响或者影响很小。

虽然这两个概念一个是对模块内部要求、一个是对模块之间的要求,但是本质都是一样的。

一个模块的内聚程度越高,才有可能对其它模块的依赖越少(低耦合);同样,如果模块之间的耦合程度很低,必然要求模块内部的内聚程度很高。


低内聚:


这里就不得不提前说一下,面向对象编程的原则之一:

单一职责

原则。

单一职责原则说的是,在我们面向对象编程,设计类的时候,一类只有一个引起它变化的原因,即类的职责应该是单一的。下面举个例子:

例如,考虑下图所示的设计。Rectangle(矩形)类有两个方法,方法draw()用于在屏幕上绘制一个矩形,方法area()用于计算矩形的面积。有两个不同的应用程序都要使用Rectangle类,一个是几何计算系统,Rectangle类会在几何形状计算方面为它提供帮助;一个是绘图系统,它需要使用Rectangle类在屏幕上绘制矩形。

在这里插入图片描述

上面Rectangle类就不符合单一职责的原则。

一个职责提供画矩形几何图形的功能,一个职责提供了计算矩形面积的功能。

违反单一职责原则会导致一些严重的问题。首先,因为几何计算系统要使用Rectangle类,而Rectangle类又要使用GUI包。所以,在部署安装几何计算系统时,我们必须将GUI包中的类代码一起部署安装。其次,如果因为某些原因,绘图系统的改变导致了Rectangle类的改变,那么这个改变就强迫我们重新构建、测试和部署几何计算系统。

因此,一个类(模块)在设计的时候,只有内聚程度高(单一职责),对其它模块的依赖才低。


低耦合:


说的就是模块之间的相互依赖程度应该尽可能低。试想,如果系统中有10个模块,一个模块修改,其它9个模块都得跟着一起修改,这种牵一发而动全身的做法,你都不想干吧。

关于代码的可维护性与可以复用性,这里有一个活字印刷的生动例子:


设计模式——为什么要使用设计模式



2、对象对象编程原则

为了达到低耦合、高内聚的目的,面向对象编程有一些同样的原则,一般来说,如果在编程过程中,应尽量去遵循了这些原则。而我们按照涉及模式去设计的时候,往往也是为了让我们的代码遵循这些原则。

面向对象编程五大原则(SOLID):


  • 单一职责

    原则(SRP):表明一个类有且只有一个职责。一个类就像容器一样,它能添加任意数量的属性、方法等。


  • 开放封闭

    原则(OCP):一个类应该对扩展开放,对修改关闭。这意味一旦创建了一个类并且应用程序的其他部分开始使用它,就不应该修改它。


  • 里氏替换

    原则(LSP):派生的子类应该是可替换基类的,也就是说任何基类可以出现的地方,子类一定可以出现。值得注意的是,当通过继承实现多态行为时,如果派生类没有遵守LSP,可能会让系统引发异常。


  • 接口隔离

    原则(ISP):表明类不应该被迫依赖他们不使用的方法,也就是说一个接口应该拥有尽可能少的行为,它是精简的,也是单一的。


  • 依赖倒置

    原则(DIP):表明高层模块不应该依赖低层模块,相反,他们应该依赖抽象类或者接口。这意味着不应该在高层模块中使用具体的低层模块。

另外,还要两个原则也是经常用到的:


  • 迪米特原则

    也叫最少知道原则,即一个类对其它的类的介入应该越少越好,即对于被依赖的类,不管多么复杂,逻辑都尽量封装在内部,尽量少对外部暴露。

  • 合成复用原则

    , 尽量使用组合或者聚合的方式来复用一些已有的对象,使它们成为新对象的一部分,即多使用组合与聚合,少使用继承。

【参考文章】

1、https://zhuanlan.zhihu.com/p/158379849

2、https://blog.51cto.com/u_15296378/4969505

3、https://blog.csdn.net/weixin_45500205/article/details/126175483



版权声明:本文为weixin_43354152原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。