• C# 设计原则 之 开放封闭 原则


    关于开放封闭原则,其核心的思想是:

    软件实体应该是可扩展,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的。

    因此,开放封闭原则主要体现在两个方面:

    对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。

    对修改封闭,意味着类一旦设计完成,就可以独立完成其工作,而不要对类进行任何修改。

    封装抽象不是目的,目的是封装变化 

    下面一个银行的业务 需求:

    用户 的需求只有 存钱 取钱
    银行柜台 接待客户,接受 用户的操作
    银行系统 柜台人员使用 电脑上的银行系统软件 进行 存钱 取钱

    具体实现代码 如下:

    1.1封装一个接口 用于 处理 银行的 业务。根据客户 需求而定,客户需求只有 存钱和取钱,如有其他业务 可进行扩展

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. namespace 开闭职责.开发封闭原则.interfaceClassify
    7. {
    8. public interface InterfaceBankSystem
    9. {
    10. void SpecificBusiness();
    11. }
    12. }

    1.2存钱的需求  实现 银行的业务接口1.1

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. using 开闭职责.开发封闭原则.interfaceClassify;
    7. namespace 开闭职责.开发封闭原则.classClassify
    8. {
    9. public class SaveMoneyClass : InterfaceBankSystem
    10. {
    11. public void SpecificBusiness()
    12. {
    13. Console.WriteLine("用户存钱");
    14. }
    15. }
    16. }

    1.3取钱的需求 实现 银行的业务接口1.1

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. using 开闭职责.开发封闭原则.interfaceClassify;
    7. namespace 开闭职责.开发封闭原则.classClassify
    8. {
    9. public class DrawMoneyClass : InterfaceBankSystem
    10. {
    11. public void SpecificBusiness()
    12. {
    13. Console.WriteLine("用户取钱");
    14. }
    15. }
    16. }

    2.1封装一个 客户需求接口类,返回 银行业务接口;客户只有 存钱和取钱

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. namespace 开闭职责.开发封闭原则.interfaceClassify
    7. {
    8. public interface InterfaceCustomerDemand
    9. {
    10. InterfaceBankSystem GetBusiness();
    11. }
    12. }

    2.2存钱的需求 实现 客户需求接口类2.1

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. using 开闭职责.开发封闭原则.interfaceClassify;
    7. namespace 开闭职责.开发封闭原则.classClassify
    8. {
    9. public class SaveMoneyCustomerDemandrClass : InterfaceCustomerDemand
    10. {
    11. public InterfaceBankSystem GetBusiness()
    12. {
    13. return new SaveMoneyClass();
    14. }
    15. }
    16. }

    2.3取钱的需求 实现 客户需求接口类2.1

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. using 开闭职责.开发封闭原则.interfaceClassify;
    7. namespace 开闭职责.开发封闭原则.classClassify
    8. {
    9. public class DrawMoneyCustomerDemandClass : InterfaceCustomerDemand
    10. {
    11. public InterfaceBankSystem GetBusiness()
    12. {
    13. return new DrawMoneyClass();
    14. }
    15. }
    16. }

    3.实现 银行柜台接待用户的业务

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. using 开闭职责.开发封闭原则.interfaceClassify;
    7. namespace 开闭职责
    8. {
    9. public class BankCounter
    10. {
    11. public void Operate(InterfaceCustomerDemand interfaceBankCounter)
    12. {
    13. interfaceBankCounter.GetBusiness().SpecificBusiness();
    14. }
    15. }
    16. }

    4.实现调用

    1. using 开闭职责.开发封闭原则.classClassify;
    2. using 开闭职责.开发封闭原则.interfaceClassify;
    3. namespace 开闭职责
    4. {
    5. internal class Program
    6. {
    7. static void Main(string[] args)
    8. {
    9. InterfaceCustomerDemand interfaceBankCounter = new DrawMoneyCustomerDemandClass();//SaveMoneyCounterClass();
    10. BankCounter bankCounter = new BankCounter();
    11. bankCounter.Operate(interfaceBankCounter);
    12. Console.ReadKey();
    13. }
    14. }
    15. }

  • 相关阅读:
    Python 爬虫实战之爬淘宝商品并做数据分析
    Compute通过Conductor访问数据库方法
    吃透负载均衡
    【计算机网络】TCP传输控制协议——三次握手
    nodeJs--http模块
    LLM - 大语言模型(LLM) 的 评估体系
    小侃设计模式(六)-适配器模式
    闯关无边界时代,荣耀与华为全场景OS相见
    2023年智能家居占消费电子出货量28%,蓝牙Mesh照明占据重要位置
    为什么 GraphQL 可以取代 Redux?
  • 原文地址:https://blog.csdn.net/q8812345qaz/article/details/127561208