开放闭合原则(Open-Closed Principle or OCP)

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/341 访问。

开放闭合原则又叫开闭原则,即软件实体应当对扩展开放,对修改封闭。

OCP:Software entities should be open for extension,but closed for madification.

开闭原则就是指软件实体应当尽量保证在不修改原有代码的情况下,对软件进行扩展。开闭原则是面向对象设计的基石。

示例:

public interface IMobilePhone {decimal Price { get; set; }string Model { get; set; }Color Color { get; set; }}
public enum Color {Black,White
}

首先用IMobilePhone接口建立手机契约,并向外暴露3个属性,Price属性为手机价格,Model属性为手机型号,Color属性为手机外观颜色,接下来我们用此接口实现一个ApplePhoneX的类。

注:手机接口IMobilePhone最好不要命名为IPhone,ApplePhoneX类不要命名为IPhoneX,因为这容易引起误解。

public class ApplePhoneX : IMobilePhone {public virtual double Price {get => 8799;set => Price = value;}public virtual string Model {get => "IPhone X";set => Model = value;}public virtual Color Color {get => Color.Black;set => Color = value;}}

以下是一个调用方可能的代码:

IMobilePhone mobilePhone = new ApplePhoneX();
var price = mobilePhone.Price;

现在需求发生了变化,因为IPhone9上市在即,库克决定为IPhoneX打折促销,黑色的IPhoneX降价为6500.00元,白色的IPhoneX降价为6450.00元, 容易想到的一个做法是,修改IMobilePhone接口,增加DiscountPrice属性,可能如下所示:

public interface IMobilePhone {double Price { get; set; }string Model { get; set; }Color Color { get; set; }double DiscountPrice { get; set; }//增加}
public class ApplePhoneX : IMobilePhone {public virtual double Price {get => 8799;set => Price = value;}public virtual string Model {get => "IPhone X";set => Model = value;}public virtual Color Color {get => Color.Black;set => Color = value;}public virtual double DiscountPrice {//增加get => Color == Color.Black ? 6500.00 : 6450.00;set => DiscountPrice = value;}}
public class HuaweiPhone : IMobilePhone {//需要修改
}
public class SmartisanPhone : IMobilePhone {//需要修改
}

但是这次修改将会影响到所有实现IMobilePhone接口的类,比如HuaweiPhone类和SmartisanPhone类。接口作为一种契约,应当是一种稳定的存在,不允许轻易修改,否则将明显违反开闭原则。以下给出一个解决方案以供参考:

public class DiscountApplePhoneX : ApplePhoneX {public override double Price {get => Color == Color.Black ? 6500.00 : 6450.00;set => Price = value;}}
IMobilePhone mobilePhone = new DiscountApplePhoneX();
var price = mobilePhone.Price;

通过增加一个继承自ApplePhoneX的DiscountApplePhoneX类并重写Price方法来解决这个新需求,原来的所有代码均不需要更改,只要在使用打折手机的地方修改其使用即可,符合开闭原则。

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/341 访问。

面向对象设计原则之2-开放闭合原则相关推荐

  1. 面向对象思想 常说的OOP五大原则就是指1、单一职责原则; 2、开放闭合原则; 3、里氏替换原则; 4、依赖倒置原则; 5、接口隔离原则。...

    常说的OO五大原则就是指其中的 : 1.单一职责原则: 2.开放闭合原则: 3.里氏替换原则: 4.依赖倒置原则: 5.接口隔离原则. https://blog.csdn.net/Anders_Zhu ...

  2. 设计原则之一:开放封闭原则

    1:什么是开放封闭原则 开放封闭原则(Open-Closed Principle):一个软件实体应当对扩展开放(open),则修改关闭(不修改原来的代码这就是closed).在设计一个模块时,应当使得 ...

  3. 设计模式原则之:开放封闭原则

    上一篇文章,我们讲了一个最基础的设计原则:单一职责原则.这一讲,我们来看下一个设计原则:开放封闭原则. 作为一名程序员,来了一个需求就要改一次代码,这种方式我们已经见怪不怪了,甚至已经变成了一种下意识 ...

  4. 如何向妻子解释面向对象设计(OOD)

    前言 此文译自CodeProject上<How I explained OOD to my wife>一文,该文章在Top Articles上排名第3,读了之后觉得非常好,就翻译出来,供不 ...

  5. solid 设计原则 php,面向对象设计SOLID五大原则

    今天我给大家带来的是面向对象设计SOLID五大原则的经典解说. 我们知道,面向对象对于设计出高扩展性.高复用性.高可维护性的软件起到很大的作用.我们常说的SOLID五大设计原则指的就是: S = 单一 ...

  6. 面向对象的七种原则:单一职责原则,开放关闭原则

    我们的知识星球马上就要开始更新设计模式了,在更新设计模式之前,我们是不是需要做一些准备呢?否则设计模式中一些遵循的原则大家会一头雾水,所以我今天来给大家说一些面向对象的七种原则,有人说是6种有人说是7 ...

  7. 【设计模式系列】之OO面向对象设计七大原则

    1  概述 本章叙述面向向对象设计的七大原则,七大原则分为:单一职责原则.开闭原则.里氏替换原则.依赖倒置原则.接口隔离原则.合成/聚合复用原则.迪米特法则. 2  七大OO面向对象设计 2.1 单一 ...

  8. 面向对象设计原则之三:里氏替换原则

    里氏替换原则(Liskov Substitution Principle LSP)   里氏替换原则是面向对象设计的基本原则之一.任何基类可以出现的地方,子类一定可以出现.LSP是继承复用的基石,只有 ...

  9. 设计模式--程序猿必备面向对象设计原则

    23种设计模式+额外常用设计模式汇总 (持续更新) 单一职责原则SRP(Single Responsibility Principle) 就一个类而言,应该仅有一个引起它变化的原因. 开放-关闭原则O ...

最新文章

  1. 【Ubuntu】dpkg: 处理软件包 XXXX (--configure)时出错解决方法
  2. Java培训哪家机构好
  3. 日期相减计算年_Excel教程:excel日期问题的小妙招
  4. Javascript 获取Url值 --转
  5. 合成孔径雷达基于RDA算法的点目标仿真
  6. 整体关闭screen(转)
  7. 成功解决ValueError: Found input variables with inconsistent numbers of samples: [86, 891]
  8. 利用Photoshop减小照片景深
  9. netty 客户端断开 异常处理_netty案例,netty4.1基础入门篇八《NettyClient半包粘包处理》发数据方式》...
  10. script标签里src为php,如何获取指定为script标记的'src'的文件的内容?
  11. P1527 [国家集训队]矩阵乘法
  12. 关于JEECG 开源声明
  13. C#绘图工具之Move
  14. 2018 “百度之星”程序设计大赛 - 初赛(A)P1002度度熊学队列(双端队列模拟,STL)
  15. FusionCompute产品介绍
  16. truffle填坑指南:truffle unbox react项目npm run start启动失败
  17. 腾达a9服务器无响应,腾达(Tenda)A9设置网站打不开怎么办?
  18. 微信6.6.7版本摇塞子破解思路(居多图)
  19. 引言-知识技能树(数据分析相关)
  20. Mn0.15V2O5·nH2O锌离子电池正极材料的储锌性能

热门文章

  1. C/C++——cmd下丢失mspdb100.DLL解决方法
  2. 《剑指Offer》 旋转数组的最小数字
  3. BinarySearch 有序表的二分查找
  4. Linux Ubuntu 查看cpu信息
  5. Ubuntu 下配置lamp环境
  6. css-animaton-随堂-风车动画-加载动画-走路动画
  7. MySQL sql trace的使用
  8. 【进阶2-3期】JavaScript深入之闭包面试题解
  9. jQuery 图片裁剪插件 Jcrop
  10. 微信小程序开发之路(二)