`
SuseLinux
  • 浏览: 26910 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

设计原则之:开闭原则

    博客分类:
  • Java
 
阅读更多

开闭原则:  一个软件个体,应该对扩展开放,对修改关闭。

 

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大原则:开闭原则

    设计模式6大原则:开闭原则

    读书笔记:开闭原则、单一原则去设计一个简单的android图片缓存.zip

    读书笔记:开闭原则、单一原则去设计一个简单的android图片缓存

    JAVA设计模式之设计原则 ---开闭原则源码

    开闭原则是面向对象设计中的一个核心原则,它在JAVA设计模式中占据着重要的地位。这一原则由格里·贝斯提出,旨在指导开发者如何设计可维护和可扩展的软件系统。开闭原则(Open-Closed Principle,OCP)的核心思想是...

    读书笔记:设计原则开闭原则.zip

    读书笔记:设计原则开闭原则

    什么是开闭原则,java开闭原则

    开闭原则是面向对象设计的核心原则之一,它的全称是"对扩展开放,对修改关闭",即在软件设计过程中,我们希望系统能够容易地添加新功能,同时保持原有代码的稳定性,避免频繁修改。这一原则由 Bertrand Meyer 在他的...

    JAVA开闭原则

    JAVA开闭原则是一种重要的软件设计思想,其核心理念在于提高软件系统的灵活性、稳定性和可维护性。开闭原则强调“对扩展开放,对修改关闭”,即在设计阶段应该确保软件模块能够在不修改原有代码的基础上,通过扩展的...

    面型对象设计原则——开闭原则(OCP)的Demo+静态结构图

    开闭原则(Open-Closed Principle,简称OCP)是面向对象设计中的一个核心原则,它在软件工程领域具有举足轻重的地位。该原则由 Bertrand Meyer 在其著作《Object-Oriented Software Construction》中提出,旨在提高...

    开闭原则1

    开闭原则是面向对象设计的基本原则之一,由勃兰特·梅耶在1988年提出。这个原则的核心思想是:软件实体(如模块、类、接口和方法)应该对扩展开放,对修改关闭。这意味着在需求变更时,我们可以通过增加新代码来扩展...

    该怎么使用Java设计模式编程中的OCP开闭原则?.pdf

    在软件开发中,开闭原则是面向对象设计中最基础的设计原则之一,它指导我们如何建立稳定灵活的系统。开闭原则定义:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。然而,开闭原则仅仅告诉我们对扩展开放...

    Java Web设计模式之OCP(开闭原则)

    开闭原则(Open-Closed Principle,OCP)是软件工程中的一个基本原则,由Bertrand Meyer在1988年提出,它是面向对象设计的核心之一。这个原则规定了软件实体(如类、模块、函数等)应该对扩展开放,对修改关闭。这...

    11丨软件设计的开闭原则:如何不修改代码却能实现需求变更?.pdf

    开闭原则是面向对象设计中的一个基本原则,它指导着我们如何设计出可维护、可扩展的软件系统。根据开闭原则,软件实体如模块、类或函数应当对扩展开放,对修改关闭。这意味着当需求发生变化时,我们应当尽可能地通过...

    开闭原则----图片缓存

    开闭原则是面向对象设计中的一个基本原则,它由软件工程专家 Bertrand Meyer 在其著作《Object-Oriented Software Construction》中提出。这个原则的核心思想是“对扩展开放,对修改关闭”。简单来说,就是模块应该...

    设计原则与设计模式

    面向对象设计原则:面向对象设计原则、开闭原则、里氏替换原则、里氏替换原则、里氏替换原则

    该怎么使用Java设计模式编程中的OCP开闭原则?.docx

    例如,在 Sunny 软件公司开发的 CRM 系统中,为了支持多种图表显示方式,我们可以使用抽象化的方式来重构系统,使之符合开闭原则。在重构后,系统可以增加新的图表类时无须修改源代码,满足开闭原则。 在实际开发中...

    读书笔记:java 23种设计模式 开闭原则 依赖倒转原则 迪米特法则 设计模式思想 Java入门demo.zip

    读书笔记:java 23种设计模式 开闭原则 依赖倒转原则 迪米特法则 设计模式思想 Java入门demo

    java设计原则16种:总结完整版(PDF)

    ### Java设计原则16种详解 #### 一、一类的设计原则 ##### 1. 依赖倒置原则(Dependency Inversion Principle, DIP) **定义**:依赖倒置原则要求高层模块不应该依赖于低层模块,二者都应该依赖于抽象。同时,...

    程序员必备的七大面向对象设计原则

    开闭原则是面向对象设计中最重要的原则之一。它定义为:一个软件实体应当对扩展开放,对修改关闭。也就是说,在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展,即实现在不修改源代码的情况下改变...

    面向对象设计模式设计原则

    ### 一、开闭原则(Open/Closed Principle) 开闭原则由Bertrand Meyer提出,其核心思想可以概括为:“软件实体应当对扩展开放,对修改关闭”。这意味着,在不修改现有代码的基础上,可以很容易地扩展新的功能。...

    设计模式六大原则

    设计模式六大原则(6):开闭原则 定义:软件实体(类、模块、函数等)应对扩展开放,对修改关闭。意味着在不影响现有代码的基础上,可以添加新的功能。 问题由来:频繁的修改导致代码不稳定,维护成本提高。 解决...

Global site tag (gtag.js) - Google Analytics