【愚公系列】2023年10月 面向对象设计原则(二)-开放闭合原则(Open-Closed Principle or OCP)

举报
愚公搬代码 发表于 2021/12/02 18:34:52 2021/12/02
【摘要】 面向对象设计原则是一些通用的软件设计原则,用于指导软件设计人员开发高质量、可扩展、可维护的软件系统。

🏆 作者简介,愚公搬代码
🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,阿里云专家博主,腾讯云优秀博主,掘金优秀博主,51CTO博客专家等。
🏆《近期荣誉》:2022年CSDN博客之星TOP2,2022年华为云十佳博主等。
🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。
🏆🎉欢迎 👍点赞✍评论⭐收藏

🚀前言

面向对象设计原则是一些通用的软件设计原则,用于指导软件设计人员开发高质量、可扩展、可维护的软件系统。这些原则的作用如下:

  1. 提高软件系统的可维护性:遵循面向对象设计原则可以将代码分解为更小、更专注的模块,从而降低代码的复杂性和耦合度,提高系统的可读性和可维护性。

  2. 提高软件系统的可扩展性:开放封闭原则可以帮助软件系统更容易地适应变化,降低对现有代码的影响,从而提高软件系统的可扩展性和灵活性。

  3. 提高软件系统的重用性:接口隔离原则可以将接口分解为更小、更专注的部分,提高代码的可读性和可复用性,从而提高软件系统的重用性。

  4. 提高软件质量:通过遵循面向对象设计原则,软件设计人员可以避免一些常见的设计错误,从而提高软件系统的质量和可靠性。

遵循面向对象设计原则可以帮助软件设计人员开发高质量、可扩展、可维护和重用的软件系统。

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

开放闭合原则(Open-Closed Principle or OCP)是面向对象编程中的一个基本原则,由Bertrand Meyer提出。该原则指出:一个软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。也就是说,一个软件实体在扩展时,不应该对原有的代码进行修改,而应该通过添加新的代码来实现扩展。

这个原则的主要目的是促进代码的可维护性和可扩展性。当我们需要对软件进行修改时,如果能够遵循开放闭合原则,就可以大幅度减小对原有代码的影响,从而减小错误的风险,提高代码的质量和可靠性。同时,开放闭合原则也可以促进代码的重用,因为我们可以通过添加新的代码来实现新的功能或扩展,而不是重复复制粘贴已有的代码。

开放闭合原则是面向对象编程中的一个基本原则,也是SOLID原则中的一条。在实际开发中,我们应该尽可能遵循这个原则,从而提高代码的质量和可维护性。

🚀二、使用步骤

🔎1.示例

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方法来解决这个新需求,原来的所有代码均不需要更改,只要在使用打折手机的地方修改其使用即可,符合开闭原则。


🚀总结

开闭原则是一个最基本的原则,另外五个原则都是开闭原则的具体形态,是指导设计的工具和方法,而开闭原则才是精神领袖.

  1. 开闭原则有利于进行单元测试
  2. 开闭原则可以提高复用性
  3. 开闭原则可以提高可维护性
  4. 面向对象开发的要求

🚀感谢:给读者的一封信

亲爱的读者,

我在这篇文章中投入了大量的心血和时间,希望为您提供有价值的内容。这篇文章包含了深入的研究和个人经验,我相信这些信息对您非常有帮助。

如果您觉得这篇文章对您有所帮助,我诚恳地请求您考虑赞赏1元钱的支持。这个金额不会对您的财务状况造成负担,但它会对我继续创作高质量的内容产生积极的影响。

我之所以写这篇文章,是因为我热爱分享有用的知识和见解。您的支持将帮助我继续这个使命,也鼓励我花更多的时间和精力创作更多有价值的内容。

如果您愿意支持我的创作,请扫描下面二维码,您的支持将不胜感激。同时,如果您有任何反馈或建议,也欢迎与我分享。

在这里插入图片描述

再次感谢您的阅读和支持!

最诚挚的问候, “愚公搬代码”

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。