`

开放-封闭原则

阅读更多

前言:阅读本章,OCP原则是第一章单一职责原则的基础上的延伸。对于构建一个实用的稳定的类十分重要,无论使用何种设计模式,OCP原则都是我们划分抽象类的基础。“模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体。所以它对于更改可以是关闭的。同时,通过从这个抽象体派生,可以扩展此模块的行为。”是核心思想。

“任何系统在其生命周期中都会发生变化。如果我们期望开发出的系统不会在第一版否就必须牢牢地记住这一点”那么怎样的设计才能面对需求的改变却可以保持相对稳定,从而使得系统可以在第一版以后不断推出新的版本呢?开放一封闭原则为我们提供了指引。

1.1开放一封闭原则(OCP)

软件实体(类、模块、函数)应该是厉以扩展的,但是不可修改的.
如果程序巾的一处改动就会产生连锁反应,导致一系列相关模块的改动,那公设计就具有僵化性的臭味.OCP建议我们应该对系统进行重构,这样以后对系统再进行那柽的改动时,就不会导致更多的修改,

2.2描述

遵循开放-封闭原则设计出的模块具有两个主要的特征。他们是:

1.对于扩展是开放的
这意味这模块行为是可以扩展的。当应用的需求改变时,我们可以对模块进行扩展,使其具有满足那些改变的新行为。换而言之,我们可以改变模块的功能。

2.对于更改是封闭的
对模块行为进行扩展时,不必改动模块的源代码。模块的二进制编译码不必修改。

这两个特性好像是相互矛盾的。扩展模块行为的通常方式就是修改该模块的源代码。不允许修改的模块常常都是被认为是具有固定模式的行为。

怎样可能在不改动模块源代码的情况下去更改它的行为呢?怎样才能在无需对模块进行改动的情况下就改变它的功能呢?

2.3关键是抽象

在所有OOPL语言中,可以创建出固定却能够描述一组任意个可能行为的抽象体。这个抽象体就是抽象基类。而这一组任意个可能的行为则表现为可能的派生类。

模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体。所以它对于更改可以是关闭的。同时,通过从这个抽象体派生,可以扩展此模块的行为。

下图展示了一个简单的不遵循OCP原则的设计。

Client类和Server类都是具体的类,Client类使用Server类。如果我们希望Client类对象使用另一个不同的服务器对象,那么必须要把Client类中使用Server类的地方更改为新的服务器类。(这样就模块了我们之前的原则,设计的臭味不言而喻)

注意下图:

上图展示了一个针对上述问题遵循OCP的设计。在这个设计中,Clientinterface类是一个拥有抽象成员函数的抽象类。Client类使用这个抽象类;然而Client类的对象却是用Server类的派生类对象。如果我们希望Client对象使用一个不同的服务器对象,那么只要从ClientInterface类派生实现一个新的类,不用修改Client类。稍后我们会举一个实际的例子来表现如何进行这一抽象与分离。

也许你想知道我为何把抽象接口命名为ClientInterface。为何不把它命名为AbstractServer呢?因为(后面将会看到)抽象类和他们的客户的关系要比和实现他们的类的关系更为密切一些。

上图展示了另一个可选的结构。Policy类具有一组实现了某种策略的共有函数。这些策略函数使用了一些抽象接口描述了一些要完成的功能。不同的是,在这个结构中,这些抽象接口是Policy类本身的一部分。这些函数在Policy的子类中实现。这样,可以通过从Policy类派生出新类的方式,对Policy中指定的行为进行扩展或者更改。(这中方式其实就是利用继承的特性)

这两种模式(一种是接口一种是继承派生)是满足OCP的最常用的方法。应用他们,可以把一个功能的通用部分和实现细节部分清晰的分离开来。

分享到:
评论

相关推荐

    通讯前三强开放-封闭原则内部培训幻灯片pps

    通讯前三强开放-封闭原则内部培训幻灯片pps通讯前三强开放-封闭原则内部培训幻灯片pps

    PHP面向对象五大原则之开放-封闭原则(OCP)详解

    开放-封闭原则(Open-Closed Principle,OCP)是面向对象设计(OOD)的五大原则之一,由Bertrand Meyer在1998年提出。该原则旨在指导软件系统的设计,使其能够容易地扩展新功能,同时在扩展时不影响现有代码的稳定性...

    第二十六讲:基础一开放封闭原则

    **第二十六讲:基础一开放封闭原则** 在软件设计领域,开放封闭原则(Open-Closed Principle,OCP)是面向对象设计的五大原则之一,由Bertrand Meyer在1988年提出。这一原则旨在指导我们如何构建可扩展且易于维护的...

    6开放封闭原则-课程内容.rar

    在“6开放封闭原则-课程内容.pdf”中,可能涵盖了以下知识点: 1. **原则的解释与实例**:详细阐述开放封闭原则的概念,并通过实际的代码示例来解释如何在实践中遵循这一原则。 2. **面向接口编程**:开放封闭原则...

    设计模式学习笔记

    在本文中,我们将探讨三个主要的设计模式:简单工厂模式、策略模式以及两个重要的设计原则:单一职责原则和开放-封闭原则。 1. **简单工厂模式**: 简单工厂模式是一种创建型设计模式,它将对象实例化的责任集中在...

    ocp原则

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

    java设计模式 pdf

    本篇文章将详细介绍几种常见的Java设计模式及其背后的原理,包括单一职责原则(SRP)、开放-封闭原则(OCP)、里氏替换原则(LSP)、依赖倒置原则(DIP)等。 #### 单一职责原则(SRP) **定义**:单一职责原则...

    设计模式之初见

    ### 设计模式之初见 #### 业务封装的重要性 在软件开发中,业务封装是指将业务逻辑与界面逻辑分开,以...无论是业务封装、类间关系管理还是遵循单一职责和开放封闭原则,都能帮助开发者构建出更加健壮和灵活的系统。

    软件可扩展性实践.ppt

    Bertrand Meyer在1988年提出的开放-封闭原则(OCP)是指导软件设计的重要原则,它提倡软件设计应做到“对于扩展是开放的,对于更改是封闭的”。 开放-封闭原则的两个核心原则是: 1. “对于扩展是开放的”:意味着...

    也有面向对象设计原则.

    #### 原则3:开放-封闭原则(OCP) **开放-封闭原则** - OCP指出软件实体(如类、模块、函数等)应该对扩展开放,对修改封闭。这意味着实体应该易于扩展而无需修改现有代码。 **OCP示例** - 通过实例解释了...

    面向对象设计原则(整理)

    本文将详细介绍五个核心的设计原则:单一职责原则(SRP)、开放-封闭原则(OCP)、Liskov替换原则(LSP)、依赖倒置原则(DIP)和接口分离原则(ISP),并探讨它们的应用场景和价值。 #### 1. 单一职责原则(SRP) ...

    用 Objective-C 实现《大话设计模式》书中的例子,并用一些 Objective-C 的特性对例子的实现加以优化

    开放-封闭原则(OCP),是说软件实体(类、模块、函数等等)应该可以拓展,但是不可修改。 依赖倒转原则(DIP),A. 高层模块不应该依赖低层模块,两个都应该依赖抽象。B. 抽象不应该依赖细节,细节应该依赖抽象。 ...

    面向对象设计三要素五原则六视点

    开放-封闭原则指出软件实体(如类、模块、函数等)应当对扩展开放,对修改封闭。这意味着可以通过扩展来添加新功能,而无需修改现有代码。 - **多态保证了扩展的开放性**:通过多态,可以轻松地添加新功能而不改变...

    高级软件工程复习题.docx

    在软件设计中,存在多种设计原则,例如LSP(Liskov替换原则)、OCP(开放-封闭原则)、SRP(单一职责原则)、ISP(接口隔离原则)、DIP(依赖倒置原则)等。这些原则是指导软件设计的基本原则,旨在提高软件的可维护...

    浅谈C#设计模式之开放封闭原则

    答案是在程序设计的时候使用开放封闭原则。   但是设计的同时,绝对对修改的关闭是不可能的,无论模块是多么的封闭,都存在一些无法对之封闭的变化,既然不可以完全的封闭,设计人员必须对他设计的模块应该对哪种...

    设计模式:C++ 描述

    开放-封闭原则是指软件实体(如类、模块、函数等)应该对扩展开放,对修改封闭。也就是说,当需求发生变化时,可以通过增加新的代码来满足新需求,而不是修改已有的代码。这有助于保持代码的稳定性和可维护性,减少...

    软件工程期末考试类型.docx

    考生需要理解这些原则的含义和应用,例如单一职责原则强调类的职责集中,开放-封闭原则强调软件的可扩展性和可维护性。 3. **简答题**:可能会要求考生解释面向对象设计的一些原则。例如,面向对象设计的五个基本...

    面向对象设计原则与设计说明

    开放-封闭原则主张“对扩展开放,对修改关闭”。这意味着一个模块在设计时应该允许在不修改原有代码的情况下进行扩展。这要求我们在设计时考虑未来可能的变化,并通过抽象和接口来实现这种灵活性。遵循这一原则可以...

Global site tag (gtag.js) - Google Analytics