必知必会的设计原则——开放封闭原则
Posted realyrare
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了必知必会的设计原则——开放封闭原则相关的知识,希望对你有一定的参考价值。
概述
开放封闭原则是面向对象所有原则的核心。
对功能扩展开放,面向修改代码封闭。
需求改变时,在小改变软件实体源代码(类、接口、方法等)的前提下通过扩展功能使其满足新的需求。
需求
描述不同需求的用户去银行办理不同的业务
分析需求
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);
总结
关于开放封闭原则,通过分析不同需求的用户去银行办理不同的业务来进行了三版实现,不知道大家写的代码是其中的哪一种呢?有何疑问,欢迎交流!
作者:课间一起牛
出处:https://www.cnblogs.com/mhg215/
声援博主:如果您觉得文章对您有帮助,请点击文章末尾的【关注我】吧!
别忘记点击文章右下角的【推荐】支持一波。~~~///(^v^)\\\\\\~~~ .
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
如果您有其他问题,也欢迎关注我下方的公众号,可以联系我一起交流切磋!
以上是关于必知必会的设计原则——开放封闭原则的主要内容,如果未能解决你的问题,请参考以下文章