开闭原则: 一个软件个体,应该对扩展开放,对修改关闭。
Open - Closed Principle ( OCP )
Software Entities should be open for extension, closed for modification.
—— Bertrand Meyer.
这个定义有些high level,那么如何实现开闭原则?
它的核心意义是:“对可变性的封装”
啥叫“对可变性的封装”?首先要找到“可变性”。
例子1:一个UI系统,需要要显示一个圆,有时候也需要显示一个矩形,有时又要显示一个三角形。那么,此处“显示什么图形”就是一种“可变性”,找到这个“可变性”,就找到了要封装的对象。
例子2:一个排序系统,需要利用冒泡排序法来排序,有时又需要使用快速排序法来排序,有时又需要使用shell排序法……,在此处,使用什么算法进行排序,就是一种“可变性”,也即要封装的对象。
如何封装“可变性”?
很简单,一种“可变性”一定会有诸多种可变的形态(如同上述的各种排序算法,各种图形),这一系列的可变形态也必然有共性,要不然也不会归为同一种“可变性”。
那么,共性作为抽象的类或接口,而各种实际的可变的形态作为具体实现类。
参考:策略模式。
在实际的工作中,“开闭原则”一般设计过程,可能是先满足一种特性,然后考虑到这种特性会有变化,则把这种变化封装起来。
举例来说:上述例子2,最初拿到的需求可能只要求用冒泡排序来实现,可能直接一个方法一个类就搞定了。后来,需求发生了改动,要求再实现使用快速排序方法来实现,那么,这个时候,可能就会考虑,“下一次会不会再让我增加一种堆排序的方法呢?”。
接着,发现了一种“可变性”,即:使用什么排序算法来实现,是一种“可变性”,这时就需要将原有代码进行重构,使用开闭原则,将“可变性”进行封装。
将“可变性”封装是开-闭原则的核心。它有两个要点:
(1)单一性。 对每一种可变性,进行单独的封装,一般情况下,不要将多种可变性封装到一起。
举例:如果有一个需求集合了上述例子1和2的功能,即根据图形的创建时间,对各种图形按多种排序算法进行排序。那么将“各种图形”与“各种排序算法”两个“可变性”单独进行封装。否则,代码的理解难度将会相当 的大。
当然,如果一个软件系统中,有多个“可变性”之间有关联,则可参考桥梁模式
(2)有穷性。 对每一个发现的“可变性”进行封装,意味着,对可变性的封装是有穷的。
“发现可变性”是设计者的行为,而且与需求强相关,比如,如果在例子2中,我们可以非常地确定只需要使用快速排序,其实排序方法根本不可能使用,而且客户也不会关心这些。那么,我们就没必要自己在那里“臆想”:既然写了快速排序,不如抽象一把,以便支持所有的排序算法吧,顺便可以让大家看看我的代码有多种牛B。
有以上想法的,肯定是有追求的程序员。但是,Too Young Too Simple。不要试图封装“所有的”可变性。
对”可变性“,发现了并确定后,才使用开-闭原则进行处理,而非要求设计者必须考虑得面面俱到。比如,一个画图软件,可以让用户画圆、画三角形、画矩形等等。那么,在设计时,只需要考虑”各种图形“这一可变性。可能有的人会考虑,用户还有男有女,有老有少,说不定有一天我们的系统根据用户的身份显示不同的风格给用户,所以我也要将”用户”这一可变性进行封装——这完全没有必要。
过度的设计,对代码是一种污染。
相关推荐
设计模式6大原则:开闭原则
读书笔记:开闭原则、单一原则去设计一个简单的android图片缓存
开闭原则是面向对象设计中的一个核心原则,它在JAVA设计模式中占据着重要的地位。这一原则由格里·贝斯提出,旨在指导开发者如何设计可维护和可扩展的软件系统。开闭原则(Open-Closed Principle,OCP)的核心思想是...
读书笔记:设计原则开闭原则
开闭原则是面向对象设计的核心原则之一,它的全称是"对扩展开放,对修改关闭",即在软件设计过程中,我们希望系统能够容易地添加新功能,同时保持原有代码的稳定性,避免频繁修改。这一原则由 Bertrand Meyer 在他的...
JAVA开闭原则是一种重要的软件设计思想,其核心理念在于提高软件系统的灵活性、稳定性和可维护性。开闭原则强调“对扩展开放,对修改关闭”,即在设计阶段应该确保软件模块能够在不修改原有代码的基础上,通过扩展的...
开闭原则(Open-Closed Principle,简称OCP)是面向对象设计中的一个核心原则,它在软件工程领域具有举足轻重的地位。该原则由 Bertrand Meyer 在其著作《Object-Oriented Software Construction》中提出,旨在提高...
开闭原则是面向对象设计的基本原则之一,由勃兰特·梅耶在1988年提出。这个原则的核心思想是:软件实体(如模块、类、接口和方法)应该对扩展开放,对修改关闭。这意味着在需求变更时,我们可以通过增加新代码来扩展...
在软件开发中,开闭原则是面向对象设计中最基础的设计原则之一,它指导我们如何建立稳定灵活的系统。开闭原则定义:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。然而,开闭原则仅仅告诉我们对扩展开放...
开闭原则(Open-Closed Principle,OCP)是软件工程中的一个基本原则,由Bertrand Meyer在1988年提出,它是面向对象设计的核心之一。这个原则规定了软件实体(如类、模块、函数等)应该对扩展开放,对修改关闭。这...
开闭原则是面向对象设计中的一个基本原则,它指导着我们如何设计出可维护、可扩展的软件系统。根据开闭原则,软件实体如模块、类或函数应当对扩展开放,对修改关闭。这意味着当需求发生变化时,我们应当尽可能地通过...
开闭原则是面向对象设计中的一个基本原则,它由软件工程专家 Bertrand Meyer 在其著作《Object-Oriented Software Construction》中提出。这个原则的核心思想是“对扩展开放,对修改关闭”。简单来说,就是模块应该...
面向对象设计原则:面向对象设计原则、开闭原则、里氏替换原则、里氏替换原则、里氏替换原则
例如,在 Sunny 软件公司开发的 CRM 系统中,为了支持多种图表显示方式,我们可以使用抽象化的方式来重构系统,使之符合开闭原则。在重构后,系统可以增加新的图表类时无须修改源代码,满足开闭原则。 在实际开发中...
读书笔记:java 23种设计模式 开闭原则 依赖倒转原则 迪米特法则 设计模式思想 Java入门demo
### Java设计原则16种详解 #### 一、一类的设计原则 ##### 1. 依赖倒置原则(Dependency Inversion Principle, DIP) **定义**:依赖倒置原则要求高层模块不应该依赖于低层模块,二者都应该依赖于抽象。同时,...
开闭原则是面向对象设计中最重要的原则之一。它定义为:一个软件实体应当对扩展开放,对修改关闭。也就是说,在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展,即实现在不修改源代码的情况下改变...
### 一、开闭原则(Open/Closed Principle) 开闭原则由Bertrand Meyer提出,其核心思想可以概括为:“软件实体应当对扩展开放,对修改关闭”。这意味着,在不修改现有代码的基础上,可以很容易地扩展新的功能。...
设计模式六大原则(6):开闭原则 定义:软件实体(类、模块、函数等)应对扩展开放,对修改关闭。意味着在不影响现有代码的基础上,可以添加新的功能。 问题由来:频繁的修改导致代码不稳定,维护成本提高。 解决...