概述 開放封閉原則是面向對象所有原則的核心。對功能擴展開放,面向修改代碼封閉。 需求改變時,在小改變軟體實體源代碼(類、介面、方法等)的前提下通過擴展功能使其滿足新的需求。 需求 描述不同需求的用戶去銀行辦理不同的業務 分析需求 1、在這段程式中 會有多少個對象2、每個對象的屬性和行為對象1: 用戶 ...
概述
開放封閉原則是面向對象所有原則的核心。
對功能擴展開放,面向修改代碼封閉。
需求改變時,在小改變軟體實體源代碼(類、介面、方法等)的前提下通過擴展功能使其滿足新的需求。
需求
描述不同需求的用戶去銀行辦理不同的業務
分析需求
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^)\\\~~~ .
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
如果您有其他問題,也歡迎關註我下方的公眾號,可以聯繫我一起交流切磋!