首页 > 其他分享 >必知必会的设计原则——开放封闭原则

必知必会的设计原则——开放封闭原则

时间:2023-02-07 09:12:54浏览次数:40  
标签:IBankProcess 原则 必知 void class 必会 new bankProcess public

概述

开放封闭原则是面向对象所有原则的核心。
对功能扩展开放,面向修改代码封闭。
需求改变时,在小改变软件实体源代码(类、接口、方法等)的前提下通过扩展功能使其满足新的需求。

需求

描述不同需求的用户去银行办理不同的业务

分析需求

1、在这段程序中 会有多少个对象
2、每个对象的属性和行为
对象1: 用户:属性记录不同类型的用户(存钱、取钱、转账....)
对象2: 银行专员:帮助我们用户处理不同的需求
对象3: 银行业务系统:处理存钱、取钱、转账等需求的操作系统

未使用开放封闭原则的代码

public class BankClient
{
    public string?  BankType { get; set; }
}
public class BankStuff
{
    private BankProcess bankProcess =new BankProcess();
    public void HandleProcess(BankClient bankClient)
    {
       
        //调用银行的业务系统,处理我们用户的需求;
        switch (bankClient.BankType)
        {
            case "存款":
                bankProcess.Deposite();
                break;
            case "取款":
                bankProcess.DrowMoney();
                break;
            case "转账":
                bankProcess.Transfer();
                break;
            case "购买基金":
                bankProcess.BuyJiJin();
                break;
            default:
                break;
        }
    }
}
public class BankProcess
{ 
  public void Deposite()
    {
        Console.WriteLine("处理用户的存款");
    }
    public void DrowMoney()
    {
        Console.WriteLine("处理用户的取款");
    }
    public void Transfer()
    {
        Console.WriteLine("处理用户的转账");
    }
    public void BuyJiJin()
    {
        Console.WriteLine("处理用户的购买基金");
    }
//C#控制台调用
BankClient bankClient = new BankClient();
bankClient.BankType = "存款";
BankStuff bankStuff=new BankStuff();
bankStuff.HandleProcess(bankClient);

BankClient bankClient2 = new BankClient();
bankClient2.BankType = "取款";
BankStuff bankStuff2 = new BankStuff();
bankStuff2.HandleProcess(bankClient2);

结论:  虽然满足需求,不符合开放封闭原则。增加功能需要对内修改。

使用开放封闭原则的代码

抽取接口,面向抽象/接口编程(类的每一个方法都抽象成接口都比较极端,需根据业务进行合理的封装)。

/*符合单一职责,开闭原则 */
    public interface IBankProcess
    {
        void Process();
    }
    public class Deposite : IBankProcess
    {
        public void Process()
        {
            Console.WriteLine("存款");
        }
    }
    public class DrowMoney : IBankProcess
    {
        public void Process()
        {
            Console.WriteLine("取款");
        }
       
    }
    public class BuyJiJin : IBankProcess
    {
        public void Process()
        {
            Console.WriteLine("购买基金");
        }
    }
    public class Transfer : IBankProcess
    {
        public void Process()
        {
            Console.WriteLine("转账");
        }
    }


    public class BankStuff3
    {
        private IBankProcess _bankProcess ;
        public void HandleProcess(BankClient bankClient)
        {

            //调用银行的业务系统,处理我们用户的需求;
            switch (bankClient.BankType)
            {
                case "存款":
                    _bankProcess=new Deposite();
                    _bankProcess.Process();
                    break;
                case "取款":
                    _bankProcess = new DrowMoney();
                    _bankProcess.Process();
                    break;
                case "转账":
                    _bankProcess = new Transfer();
                    _bankProcess.Process();
                    break;
                case "购买基金":
                    _bankProcess = new BuyJiJin();
                    _bankProcess.Process();
                    break;
                default:
                    Console.WriteLine("没有办法处理您的业务");
                    break;
            }
        }
    }
//C#控制台调用
BankClient bankClient3 = new BankClient();
bankClient3.BankType = "取款";
BankStuff3 bankStuff3 = new BankStuff3();
bankStuff3.HandleProcess(bankClient3);

结论:符合单一职责,开闭原则 。但是switch并没有解决。

解决stitch case后的代码

解决switch case问题 封装不是目的,只有 封装变化 才能做到单一职责 ,开放封闭等原则。

   /// <summary>
    /// 解决switch  case问题
    /// </summary>
    public interface IBankClient
    {
        IBankProcess GetBankClient();
    }
    public class DepositeClient : IBankClient
    {
        public IBankProcess GetBankClient()
        {
            return new Deposite();
        }
    }
    public class DrowMoneyClient : IBankClient
    {
        public IBankProcess GetBankClient()
        {
            return new DrowMoney();
        }
    }
    public class BuyJiJinClient : IBankClient
    {
        public IBankProcess GetBankClient()
        {
            return new BuyJiJin();
        }
    }
    public class TransferClient : IBankClient
    {
        public IBankProcess GetBankClient()
        {
            return new Transfer();
        }
    }
    public class BankStuff4
    {
        private IBankProcess _bankProcess;
        public void HandleProcess(IBankClient bankClient)
        {
            //调用银行的业务系统,处理我们用户的需求;
            _bankProcess = bankClient.GetBankClient();
            _bankProcess.Process();
        }
    }
//C#控制台调用
IBankClient bankClient4=new BuyJiJinClient(); //变化点  需要特别注意  //DepositeClient
new BankStuff4().HandleProcess(bankClient4);

总结

关于开放封闭原则,通过分析不同需求的用户去银行办理不同的业务来进行了三版实现,不知道大家写的代码是其中的哪一种呢?有何疑问,欢迎交流!

 

标签:IBankProcess,原则,必知,void,class,必会,new,bankProcess,public
From: https://www.cnblogs.com/mhg215/p/17095941.html

相关文章

  • 【android】Android性能优化之APP性能优化原则总结
    使用过Android系统手机的同学都知道,Android手机越用越卡,这个卡主要体现在手机系统越用越卡,打开APP的速度越来越慢。Android手机越用越卡的原因主要有:1、Android系统源码是......
  • 数据库必知必会:TiDB(1)数据库架构概述
    (数据库必知必会:TiDB(1)数据库架构概述)TiDB体系架构TiDB兼容MySQL5.7协议,支持水平扩容或者缩容的金融级高可用的云原生分布式数据库。TiDB的体系架构为:TiDBServer,接收......
  • Java设计原则
    在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据6条原则来开发程序,从而提高软件开发效率、节约软件开发成本和维护成本。......
  • 面向对象五大原则
    一、单一功能原则(SingleResponsibilityPrinciple) 一个类都应该有一个单一的功能,不为其实现过多的功能点 二、开闭原则(OpenClosedPrinciple) 软件中的对......
  • 必知必会的设计原则——单一职责原则
    概述单一职责原则是最简单的面向对象设计原则!定义为不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。说文字比较干巴巴,我们通过上代码来展示案例;未......
  • C/C++内存对齐原则
    C/C++内存对齐what&&why当用户自定义类型时(struct或class),编译器会自动计算该类型占用的字节数。C/C++为什么要内存对齐?我道行太浅,摘抄了网上的一个解释。为了方......
  • 最容易懂的策略模式消除if-else分支,实现开闭原则,提高可扩展性
    1介绍策略模式最常用的场景就是用于消除代码中的if-else,这里所说的if-else并不是说任何简单的判断都引入策略模式来优化,这样反而会增加代码的复杂度。反例:使用策略模式......
  • 设计原则:SOLID、DRY、KISS、YAGNI、LOD
    1.SOLID原则1.1SRP(SingleResponsibilityPrinciple)单一职责一个类或模块只负责完成一个功能。1.2OCP(OpenClosedPrinciple)开闭原则(模块、类、方法)对拓展开放,对......
  • mysql必知必会——GROUP BY和HAVING
    GROUPBY语法可以根据给定数据列的每个成员对查询结果进行分组统计,最终得到一个分组汇总表。select子句中的列名必须为分组列或列函数,列函数对于groupby子句定义的每个组......
  • 读Java8函数式编程笔记07_设计和架构的原则
    1. SOLID原则1.1. 开发良好面向对象程序的准则1.2. Liskovsubstitution里氏替换1.3. Interfacesegregation接口隔离1.4. Singleresponsibility单一功能原则1......