`
xiaoyaocai
  • 浏览: 39610 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

OO五大原则(2.OCP——开闭原则)(转载)

阅读更多

开闭原则很简单,一句话:“Closed for Modification; Open for Extension”——“对变更关闭;对扩展开放”。开闭原则其实没什么好讲的,我将其归结为一个高层次的设计总则。就这一点来讲,OCP的地位应该比SRP优先。

OCP的动机很简单:软件是变化的。不论是优质的设计还是低劣的设计都无法回避这一问题。OCP说明了软件设计应该尽可能地使架构稳定而又容易满足不同的需求。

为什么要OCP?答案也很简单——重用。

“重用”,并不是什么软件工程的专业词汇,它是工程界所共用的词汇。早在软件出现前,工程师们就在实践“重用”了。比如机械产品,通过零部件的组装得到最终的能够使用的工具。由于机械部件的设计和制造过程是极其复杂的,所以互换性是一个重要的特性。一辆车可以用不同的发动机、不同的变速箱、不同的轮胎……很多东西我们直接买来装上就可以了。这也是一个OCP的例子。(可能是由于我是搞机械出身的吧,所以就举些机械方面的例子^_^)。

如何在OO中引入OCP原则?把对实体的依赖改为对抽象的依赖就行了。下面的例子说明了这个过程:

05赛季的时候,一辆F1赛车有一台V10引擎。但是到了06赛季,国际汽联修改了规则,一辆F1赛车只能安装一台V8引擎。车队很快投入了新赛车的研发,不幸的是,从工程师那里得到消息,旧车身的设计不能够装进新研发的引擎。我们不得不为新的引擎重新打造车身,于是一辆新的赛车诞生了。但是,麻烦的事接踵而来,国际汽联频频修改规则,搞得设计师在“赛车”上改了又改,最终变得不成样子,只能把它废弃。

 

OCP-fig1.JPG

为了能够重用这辆昂贵的赛车,工程师们提出了解决方案:首先,在车身的设计上预留出安装引擎的位置和管线。然后,根据这些设计好的规范设计引擎(或是引擎的适配器)。于是,新的赛车设计方案就这样诞生了。

 OCP-fig2.JPG

显然,通过重构,这里应用的是一个典型的Bridge模式。这个实现的关键之处在于我们预先给引擎留出了位置!我们不必因为对引擎的规则的频频变更而制造相当多的车身,而是尽可能地沿用和改良现有的车身。
说到这里,想说一说OO设计的一个误区。
学习OO语言的时候,为了能够说明“继承”(或者说“is-a”)这个概念,教科书上经常用实际生活中的例子来解释。比如汽车是车,电车是车,F1赛车是汽车,所以车是汽车、电车、F1赛车的上层抽象。这个例子并没有错。问题是,这样的例子过于“形象”了!如果OO设计直接就可以将现实生活中的概念引用过来,那也就不需要什么软件工程师了!OO设计的关键概念是抽象。如果没有抽象,那所有的软件工程师的努力都是徒劳的。因为如果没有抽象,我们只能去构造世界中每一个对象。上面这个例子中,我们应该看到“引擎”这个抽象的存在,因为车队的工程师们为它预留了位置,为它制定了设计规范。
上面这个设计也实现了后面要说的DIP(依赖倒置原则)。但是请记住,OCP是OO设计原则中高层次的原则,其余的原则对OCP提供了不同程度的支持。为了实现OCP,我们会自觉或者不自觉地用到其它原则或是诸如Bridge、Decorator等设计模式。然而,对于一个应用系统而言,实现OCP并不是设计目的,我们所希望的只是一个稳定的架构。所以对OCP的追求也应该适可而止,不要陷入过渡设计。正如Martin本人所说:“No significant program can be 100% closed.”“Closure not complete but strategic”

分享到:
评论

相关推荐

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

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

    OO设计五个原则.pdf

    本文将详细解析这五大原则之一——开闭原则(Open-Closed Principle,简称OCP),并探讨其在软件开发过程中的应用与实践。 ### 开闭原则:面向对象设计的核心 开闭原则是由Bertrand Meyer于1988年提出的,它强调...

    开闭原则OCP.zip

    - "OCP2" 可能是一个案例分析,通过具体的代码示例展示如何遵循开闭原则进行设计,可能包括如何使用抽象、接口和设计模式来实现这一原则。 - "OCP3" 可能是一份讨论或解决方案,探讨在实际开发中遇到的问题以及如何...

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

    其实,我们遵循设计模式前面五大原则,以及使用 23 种设计模式的目的就是遵循开闭原则。 要遵循开闭原则,我们需要对系统进行抽象化设计,抽象化是开闭原则的关键。在 Java、C# 等编程语言中,可以为系统定义一个...

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

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

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

    Java 设计模式中的 OCP 开闭原则 在软件设计中,OCP 开闭原则是其中一个非常重要的设计原则。该原则定义了一个软件实体,如类、模块和函数应该对扩展开放,对修改关闭。也就是说,当软件需要变化时,应该尽量通过...

    OO设计原则总结.doc

    #### 开闭原则:Open-Closed Principle (OCP) 开闭原则主张“对扩展开放,对修改关闭”。具体来说,就是: - **增强灵活性**:允许在不修改现有代码的情况下,通过新增代码的方式对系统进行扩展。 - **提高稳定性*...

    Sybex.OCA.OCP.Java.SE.8.Programmer.Practice.Tests.Errata.pdf

    本书《Sybex.OCA.OCP.Java.SE.8.Programmer.Practice.Tests.Errata.pdf》是关于Java SE 8程序员的实践测试,主要关注Oracle Certified Associate (OCA)和Oracle Certified Professional (OCP)认证。该书由Scott ...

    Sybex.OCP.Oracle.10g.Administration.II.Study.Guide.Jan.2005.eBook-DDU

    《Sybex.OCP.Oracle.10g.Administration.II.Study.Guide.Jan.2005.eBook-DDU》是针对Oracle数据库管理员(OCP)认证的10g版第二部分学习指南,发布于2005年1月。这本书详细介绍了Oracle 10g数据库的高级管理技能,...

    Sybex.OCP.Oracle.10g.Administration.II.Study.Guide(1Z0-043)

    《Sybex.OCP.Oracle.10g.Administration.II.Study.Guide(1Z0-043)》是针对Oracle 10g数据库管理员II认证(OCP)的一本详尽学习指南,旨在帮助考生充分准备1Z0-043考试。这个压缩文件包含的资源为备考者提供了全面...

    ocp原则

    ### OCP原则详解 #### 开放-封闭原则(OCP)概览 开放-封闭原则(Open-Closed Principle, OCP)是软件工程中一个至关重要的设计原则,它由Bertrand Meyer于1988年提出,并由Robert C. Martin进一步阐述和发展。OCP的...

    面向对象七大原则——肖文斌.pdf

    1. 开闭原则(OCP - Open Closed Principle) 开闭原则是指软件实体应当对扩展开放,对修改关闭。这意味着,一旦软件实体被设计并开发完成,应当无需修改原有的代码,就可以对其进行扩展,以适应新的需求。这个原则...

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

    开闭原则(Open-Closed Principle,OCP)的核心思想是:“软件实体(如类、模块、函数等)应当对扩展开放,对修改关闭”。这意味着,当需求改变时,我们应尽量通过扩展已有代码,而不是修改已有的代码来实现新功能。...

    面向对象编程,OO设计的五大原则

    在本文中,我们将详细探讨OOP设计中的五大原则:单一职责原则(Single Responsibility Principle,简称 SRP)、开放封闭原则(Open-Closed Principle,简称 OCP)、里氏替换原则(Liskov Substitution Principle,...

    面向对象七大基本设计原则.pdf

    2. 开闭原则(Open/Closed Principle, OCP):软件实体应当对扩展开放,对修改关闭。这意味着软件系统应该能够在不修改现有代码的基础上进行功能的扩展。 3. 里氏替换原则(Liskov Substitution Principle, LSP):...

    JAVA 24种设计模式介绍与6大设计原则.pdf

    6. 开闭原则(Open/Closed Principle, OCP):软件实体应当对扩展开放,对修改关闭。这意味着在不修改现有系统的基础上,能够增加新的功能。 在这些设计模式和原则中,策略模式是一个非常重要的行为型设计模式,它...

    深入理解JavaScript系列(7) S.O.L.I.D五大原则之开闭原则OCP

    开闭原则(Open/Closed Principle,简称OCP)是面向对象设计中的一个核心原则,它在S.O.L.I.D(Single Responsibility, Open-Closed, Liskov Substitution, Interface Segregation, Dependency Inversion)五大设计...

    11c-ocp题库new.zip

    Oracle 11c OCP(Oracle Certified Professional)是Oracle公司为数据库管理员提供的专业认证,它展示了持证者在Oracle数据库11c版本管理、优化和故障排除等方面的专业技能。这个"11c-ocp题库new.zip"文件包含的是...

    开闭原则1

    开闭原则(Open-Closed Principle,简称OCP)是面向对象设计中的一个核心原则,它由Bertrand Meyer在1988年提出,并被收录在SOLID(单一职责原则、开闭原则、里氏替换原则、接口隔离原则、依赖倒置原则)这五大设计...

    软件设计的七大原则.doc

    软件设计的七大原则是软件设计的精髓所在,这七大原则分别是开闭原则、里氏代换原则、依赖倒置原则、接口隔离原则、合成/聚合复用原则、迪米特法则和抽象类原则。 一、 开闭原则(OCP) 开闭原则是指一个软件实体...

Global site tag (gtag.js) - Google Analytics