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


    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

  • 相关阅读:
    安卓应用自动化测试工具Appium实操分享
    安排项目宣讲日程得到最多的宣讲场次
    Mathtype——设置正体下标和斜体下标的方法
    1140 Look-and-say Sequence
    LAMP框架的架构与环境配置
    OpenCV学习(六)——图像算术运算(加法、融合与按位运算)
    基于货运APP的全栈开发实践:后端用PHP,前端用Uni-app实现兼容性
    OrchardCore Headless建站拾遗
    Leetcode 02.07 链表相交(链表)
    [机缘参悟-59]:《素书》-6-安于礼仪[安礼章第六]
  • 原文地址:https://blog.csdn.net/weixin_43354152/article/details/127688355