面向对象原则之一 开放封闭原则(开闭原则)

原文:面向对象原则之一 开放封闭原则(开闭原则)

前言

面向对象有人分为五大原则,分别为单一职责原则、开放封闭原则、依赖倒置原则、接口隔离原则、里氏替换原则。

也有人分为六大原则,分别为单一职责原则、开放封闭原则、依赖倒置原则、接口隔离原则、里氏替换原则、迪米特法则。

现在我们来介绍开放封闭原则,也叫开闭原则

开闭原则

1)概念

官方说法是 软件实体(模块、类、函数等)应该可以扩展,但是不可以修改。也就是说软件对扩展开放,对修改关闭。

需要说明的是,对修改关闭不是说软件设计不能做修改,只是尽量不要做不必要的修改。怎么才能做到呢?那就是有相应的扩展性。

其实,软件有相应的扩展性是好处,但是不能说每个地方都有扩展。反而造成了代码的臃肿。所以这里的扩展与修改关闭是有限制的。

开闭原则,可以说是其他五大原则的实现,也是面向对象设计的终极目标。我们也可以说成开闭原则是其他原则的核心。

说了这些概念性的东西,似懂非懂。我们可以试试从下面的例子来看看是否更加上心。

2)深入理解

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

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

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

纸杯有了它的另外一个扩展性,就是种花苗。

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

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

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

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

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

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

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

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

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

3)其他例子

开闭原则其实在大话设计模式中说得非常好,让人通俗易懂。

它举了一个例子,我觉得说得非常好。是加减乘除法的例子。

开始需求是做一个加法的操作。后来继续加入减法、乘法、除法。

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

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

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

4)总结

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

其他链接:

开放封闭原则(开闭原则)

单一职责原则

依赖倒置原则

接口隔离原则

里氏替换原则

迪米特法则

此文转发,请注明出处,谢谢。

可以关注本人的公众号,多年经验的原创文章共享给大家。

原文地址:https://www.cnblogs.com/lonelyxmas/p/10217563.html

时间: 2024-12-07 01:53:49

面向对象原则之一 开放封闭原则(开闭原则)的相关文章

面向对象的基本原则(二)------开闭原则

一.定义 开闭原则(OCP),英文全称是Open for extention, Closed for modification Principle,即对扩展开放,对修改关闭原则.该原则的思想是,可以通过扩展来满足变化,而不需要修改代码,或者说在设计一个模块的时候,应当使这 个模块可以在不被修改的前提下被扩展. 二.实现 实现开闭原则的关键是抽象,抽象是面向对象设计的一个核心特征. 对一个事物抽象化,实质上是在概括归纳总结它的本质.抽象让我们抓住最最重要的东西,从更高一层去思考,这降低了思考的复杂

设计模式六大原则(6):开闭原则(转载)

设计模式六大原则(6):开闭原则 定义:一个软件实体如类.模块和函数应该对扩展开放,对修改关闭. 问题由来:在软件的生命周期内,因为变化.升级和维护等原因需要对软件原有代码进行修改时,可能会给旧代码中引入错误,也可能会使我们不得不对整个功能进行重构,并且需要原有代码经过重新测试. 解决方案:当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化. 开闭原则是面向对象设计中最基础的设计原则,它指导我们如何建立稳定灵活的系统.开闭原则可能是设计模式六项原则中定义最

五大设计原则之(三)--------开闭原则

开闭原则(OCP)是面向对象设计中“可复用设计”的基石,是面向对象设计中最重要的原则之一,其它很多的设计原则都是实现开闭原则的一种手段. 开闭原则的定义: 一个软件实体如类,模块和函数应该对扩展开放,对修改关闭. 遵循开闭原则设计出的模块具有两个主要特征: (1)对于扩展是开放的(Open for extension).这意味着模块的行为是可以扩展的.当应用的需求改变时,我们可以对模块进行扩展,使其具有满足那些改变的新行为.也就是说,我们可以改变模块的功能. (2)对于修改是关闭的(Closed

设计模式六大原则(6):开闭原则

开闭原则 定义:一个软件实体如类.模块和函数应该对扩展开放,对修改关闭. 问题由来:在软件的生命周期内,因为变化.升级和维护等原因需要对软件原有代码进行修改时,可能会给旧代码中引入错误,也可能会使我们不得不对整个功能进行重构,并且需要原有代码经过重新测试. 解决方案:当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化. 开闭原则(Open-Closed Principle, OCP):一个软件实体应当对扩展开放,对修改关闭.即软件实体应尽量在不修改原有代码

【转】设计模式六大原则(6):开闭原则

定义:一个软件实体如类.模块和函数应该对扩展开放,对修改关闭. 问题由来:在软件的生命周期内,因为变化.升级和维护等原因需要对软件原有代码进行修改时,可能会给旧代码中引入错误,也可能会使我们不得不对整个功能进行重构,并且需要原有代码经过重新测试. 解决方案:当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化. 开闭原则是面向对象设计中最基础的设计原则,它指导我们如何建立稳定灵活的系统.开闭原则可能是设计模式六项原则中定义最模糊的一个了,它只告诉我们对扩 展

设计模式六大原则(六): 开闭原则(Open Closed Principle)

定义: 一个软件实体如类.模块和函数应该对扩展开放,对修改关闭. 问题由来: 在软件的生命周期内,因为变化.升级和维护等原因需要对软件原有代码进行修改时,可能会给旧代码中引入错误,也可能会使我们不得不对整个功能进行重构,并且需要原有代码经过重新测试. 解决方案: 当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化. 开闭原则是面向对象设计中最基础的设计原则,它指导我们如何建立稳定灵活的系统. 开闭原则可能是设计模式六项原则中定义最模糊的一个了,它只告诉我们

面向对象五大原则_基石_开闭原则

1988年,勃兰特·梅耶(Bertrand Meyer)在他的著作<面向对象软件构造(Object Oriented Software Construction)>中提出了开闭原则,它的原文是这样:"Software entities should be open for extension,but closed for modification". 翻译过来就是:"软件实体应当对扩展开放.对改动关闭". 这句话说得稍微有点专业,我们把它讲得更通俗一点,

day03_面向对象五大原则_基石_开闭原则

1988年,勃兰特·梅耶(Bertrand Meyer)在他的著作<面向对象软件构造(Object Oriented Software Construction)>中提出了开闭原则,它的原文是这样:"Software entities should be open for extension,but closed for modification".翻译过来就是:"软件实体应当对扩展开放,对修改关闭".这句话说得略微有点专业,我们把它讲得更通俗一点,也就

.NET 高级架构师 架构师之路(5)---开闭原则

2 开闭原则(Open-Closed Principle,OCP) 2.1 什么是开闭原则     开闭原则是面向对象设计中"可复用设计"的基石,是面向对象设计中最重要的原则之一,其它很多的设计原则都是实现开闭原则的一种手段. 1988年,Bertrand Meyer在他的著作<Object Oriented Software Construction>中提出了开闭原则,它的原文是这样:"Software entities should be open for e

[转]设计模式之六大原则——开闭原则(OCP)

原文地址:http://www.cnblogs.com/muzongyan/archive/2010/08/05/1793454.html 开闭原则(Open Closed Principle)是Java世界里最基础的设计原则,它指导我们如何建立一个稳定的.灵活的系统. 定义: 一个软件实体如类.模块和函数应该对扩展开放,对修改关闭. Softeware entities like classes,modules and functions should be open for extensio