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

概述

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

需求

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

分析需求

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(); //变化点  需要特别注意  //DepositeClientnew BankStuff4().HandleProcess(bankClient4);

总结

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

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