从零开始单排学设计模式「开发-封闭原则」青铜 - 白银 晋级赛

阅读本文大概需要 3 分钟。

 

本篇是设计模式系列的第九篇,虽然之前也写过相应的文章,但是因为种种原因后来断掉了,而且发现之前写的内容也很渣,不够系统。

 

所以现在打算重写,加上距离现在也有一段时间了,也算是自己的一个回顾吧!

 

学而时习之,不亦说乎。

 

推荐阅读:

从零开始单排学设计模式「装饰模式」黑铁 I

 

 

目前段位:青铜 I - 白银 III 晋级赛

 

 

Let's Go!

 

前言

 

设计模式不是语法,是一种巧妙的写法,能把程序变的更加灵活。架构模式比设计模式大,架构模式是战略,而设计模式是战术。

 

设计模式(面向对象设计)中有6大原则,分别是:单一职责原则、里氏替换原则、依赖倒转原则、接口隔离原则、迪米特法则、开放-封闭原则。

 

开放-封闭原则

 

开放-封闭原则(开-闭原则):软件实体(类、模块、函数等等)应该可以扩展,但是不可修改。

 

软件实体应该对扩展开放,对修改关闭,其含义是说一个软件实体应该通过扩展来实现变化,而不是通过修改已有的代码来实现变化。

 

软件实体包括以下几个部分: 1.项目或软件产品中按照一定的逻辑规则划分的模块 2.抽象和类 3.方法。

 

深入理解

 

开闭原则怎么能更深入的理解呢?还是说说我们身边的例子吧。

 

比如我们平常喝水用的一次性纸杯。平常人只是用来装水。喝完水就扔了。这就是这个纸杯的生命周期。纸杯这一生只完成了它的一个功能:装水。纸杯此时就很封闭了,没有什么扩展性。

 

此时,我看到身边有一支花苗,我想要拿回家种。但是没有容器呀?啊?旁边不是有一个纸杯吗,可以用此纸杯来种这朵花苗。纸杯有了它的另外一个扩展性,就是种花苗。

 

纸杯不仅有装水、种花苗的用途,以后还可以有装小垃圾、冲茶、回收等功能。对于以后这些功能,我们要想到他们的扩张性。

 

在纸杯只有一个装水的功能的时候,我们只写一个纸杯功能类,说纸杯能装水。但是以后有扩展呢?这一方面我们要预先判断。预先判断它以后可能会根据需求的变动而扩展。对于纸杯本来的装水功能,不能说不能修改,此功能只能在此函数、类中修改。这就是开闭原则的核心。

 

所以,纸杯在开闭原则所体现的是:尽量少修改,未来可能扩展的模块、类做好预算的判断。如果要修改,只能在此函数此类修改,不能牵涉到其他地方。

 

下面,我们用UML类图来直观地说明一下纸杯的设计吧。

 

当纸杯只有一个功能,装水时。有一个纸杯操作接口,有一个纸杯操作实现类。

 

 

当我们要添加一个功能 种花苗时,我们不也是加一个方法吗?如下:

 

 

当添加N个方法时,不也是在纸杯的操作接口上面添加N个方法吗?

 

我们想一想,此时已经背离了我们的开闭原则。因为每添加一个方法,都要在操作类上面做修改。所以,我们按照开闭原则,开做了以下合理的设计:

 

 

从上面可以看出,我们把纸杯的操作类,统一写成一个接口,每个不同的操作继承此接口来完成各自操作。我们还开到多了一个类,叫客户端类,其实此类也不难理解。也就是要最终操作纸杯的类。

 

其他例子

 

开闭原则其实在大话设计模式中说得非常好,让人通俗易懂。它举了一个例子,我觉得说得非常好。是加减乘除法的例子。

 

开始需求是做一个加法的操作。后来继续加入减法、乘法、除法。开始我们想加法以后可能会做一个需求变更:加入其它的算法法则。所以我们要有一个预判性,这个预判性会导致我们项目以后的扩展性,也会导致如果需求发生变更,程序修改的难易程度。

 

所以,我们要做一个算法法则的操作类,加减乘除法都继承此操作接口。再加一个算法法则的客户端类类操作此算法。

 

我们来上一下大话设计模式中的图:

 

 

总结

 

开闭原则是我们面向对象设计的目标,我们灵活地运用好此目标也不是易事。所以开闭原则要深入的理解,才能做好面向对象的编程,才能做一个好的软件。

 

 

 

往期精彩回顾

程序员接私活的7大平台利器

面试时如何优雅地自我介绍?

支撑百万并发的数据库架构如何设计?

如何向大牛请教问题?

为何IntelliJ IDEA比Eclipse更好

巧用这19条MySQL优化,效率至少提高3倍

想囤书的赶紧看过来(精选书单)

IDEA一定要懂的32条快捷键

世上最污技术解读,我竟然秒懂了

一千行MySQL详细学习笔记

七点建议助您写出优雅的Java代码

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

良月柒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值