zoukankan      html  css  js  c++  java
  • (转) 面向对象设计原则(二):开放-封闭原则(OCP)

    原文:https://blog.csdn.net/tjiyu/article/details/57079927

    面向对象设计原则(二):开放-封闭原则(OCP)

           开放-封闭原则(Open-closed principle,OCP)也称开闭原则,是面向对象设计(OOD)中比较重要、常见的一种,下面来总结开放-封闭原则的知识点,包括:

           1、什么是开放-封闭原则?

           2、为什么需要遵守开放-封闭原则?

           3、怎么做到开放-封闭原则?

           4、开放-封闭原则需要注意什么?

    1、什么是开放-封闭原则(OCP)
    1-1、原则的定义
           开放-封闭原则(Open-closedprinciple,OCP)可以表示为:

          软件实体(类、模块、函数等)应该是可以扩展的,但是不可修改的。

    1-2、两个主要的特征
           遵循开放-封闭原则设计出的模块具有两个主要的特征,如下:

    1、对于扩展是开放的(open for extension)

          这意味着模块的行为是可以扩展的。

           当应用的需求改变时,我们可以对模块进行扩展,使其具有满足那些改变的新行为。

           换句话说,我们可以改变模块的功能。

    2、对于修改是封闭的(closed for modification)

           对模块行为进行扩展时,不必改动模块的源代码或者二进制代码。

           模块的二进制可执行版本,无论是可链接的库、DLL或者.EXE文件,都无需改动。

    2、为什么需要开放-封闭原则
    2-1、开放-封闭原则能带来什么?
           可以从下面的一些问题来描述:

          怎么样的设计才能面对需求的改变却可以保持相对稳定,从而使得系统可以在第一版本以后不断推出新的版本呢?

          怎样可能在不改动模块源代码的情况下去更改它的行为呢?

          如果不改变一个模块,又怎么能够去改变它的功能呢?

           bertrand meyer 在1988年提出的著名的开放—封闭原则(the open-closed princle)为我们提供了指引。

           在许多方面,开放-封闭原则都是面向对象设计的核心所在,遵循这个原则可以带来面向对象技术所声称的巨大好处:灵活性、可重用性以及灵活性。

    2-2、违反开放-封闭原则有什么坏处?
           违反开放-封闭原则的程序中,通常一处改动就会产生连锁反应,导致一系列相关模块的改动,那么设计就具有僵化性。

           OCP建议我们应该对系统进行重构,这样以后对系统再进行这样那样的改动时,就不会导致更多的修改。

           如果正确地应用OCP,那么以后再进行同样的改动时,就只需要添加新的代码,而不必改动已经正常运行的代码。

    3、怎么做到开放-封闭原则
    3-1、抽象是关键
          由于模块依赖于一个固定的抽象体,所以它对于更改可以是封闭的。

          同时,通过从这个抽象体派生,也可以扩展此模块的行为。

    3-2、应用开放-封闭原则的两种方法
          对于类来说,开始OCP依赖于面向对象继承(特别是实现继承)的概念;

          而后来,开放/封闭原理被重新定义使用抽象接口,其中可以改变实现,还可以创建多个实现,并且彼此多态地替换。

          即可以有两种方法应用OCP:

    1、从抽象类继承

          最简单的方法是在继承原始类实现的新派生(子)类上实现新的功能。

    2、实现抽象接口

          另一种方法是使用抽象接口来调解客户端对原始类的访问,因此可以通过同一接口访问的新类实现新功能。

          两种方法都可以创建新类,并保持原始实现不变,但提倡的是第二种。

    4、开放-封闭原则需要注意什么
    4-1、无法做到100%的封闭
          无论模块是多么的"封闭",都会存在一些无法对之封闭的变化。

          设计人员需要预测出最在可能发生的变化,然后对它的遵循OCP原则;这需要设计人员有一定的经验,但通常都会预测错误。

          对此,我们需要刺激变化:因为变化发生(发现)越早、越快就越有利;刺激变化的一些方法:

          1、首先编写测试。

          2、使用很短的迭代周期进行开发。

          3、经常把开发特性展示给涉众。

          4、首先开发最重要的特性。

          5、尽早地、经常性地发布软件。尽可能频繁地把软件展示给客户和使用人员,得到他们的反馈。

    4-2、良好的抽象是开放-封闭原则的基础
          遵循开放-封闭原则的代价是昂贵的,如:

          创建适当的抽象是要花费开发时间和精力的;

          同时,那些抽象也增加了软件设计的复杂性;

          有能力处理抽象的开发人员少。

          所以,对于应用程序中的每个部分都肆意地进行抽象同样不是一个好主意,正确的做法是,开发人员仅仅对程序中出现频繁变化的那些部分作出抽象,而拒绝不成熟的抽象。

          后面有时间再来整理介绍面向对象分析与设计中抽象的话题。


    4-3、开放-封闭原则与设计模式
          另外,Strategy(策略)模式和Template Method(模板方法)模式是满足OCP的最常用方法。

          Strategy(策略)模式结构如下,可以看到通过Strategy接口很容易扩展具体的实现:

    5、总结
         开放-封闭原则:

         软件实体(类、模块、函数等)应该是可以扩展的,但是不可修改的。

         即:

        软件质量的下降,来源于修改;

         替换整个实现类,而不是修改其中的某行;

         替换的扩展类可以从抽象类继承、或实现抽象接口。

        提倡使用实现抽象接口的方式(面向接口编程)。

          开放-封闭原则是面向对象设计的核心所在,但主要的还是基本的抽象、继承、接口的知识,这和我们平时开发息息相关,所以基础很重要。
    ---------------------
    作者:尐譽
    来源:CSDN
    原文:https://blog.csdn.net/tjiyu/article/details/57079927
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    免费报表工具 积木报表(JiMuReport)的安装
    jeecgboot积木报表(jimuReport)SQL Server切换
    Machine Learning目录
    Pytorch05_torch安装(GPU版)
    Pytorch04_RNN结构
    Pytorch03_张量变化
    Pytorch02_GPU加速
    Pytorch01_通用结构
    怎么将本地文件上传到远程git仓库
    SpringCloud-微服务架构编码构建
  • 原文地址:https://www.cnblogs.com/liujiacai/p/10171970.html
Copyright © 2011-2022 走看看