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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值