首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
SAAS
ToB门户
了解全球最新的ToB事件
论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
微头条
Follow
记录
Doing
博客
Blog
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
排行榜
Ranklist
相册
Album
应用中心
qidao123.com技术社区-IT企服评测·应用市场
»
论坛
›
软件与程序人生
›
后端开发
›
.Net
›
必知必会的设计原则——开放封闭原则
返回列表
发新帖
必知必会的设计原则——开放封闭原则
[复制链接]
发表于 2023-2-7 08:53:50
|
显示全部楼层
|
阅读模式
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
×
概述
开放封闭原则是面向对象所有原则的核心。
对
功能
扩展开放,面向修改
代码
封闭。
需求改变时,在小改变软件实体源
代码
(类、接口、方法等)的前提下通过扩展
功能
使其满足新的需求。
需求
描述不同需求的用户去银行办理不同的业务
分析需求
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("处理用户的购买基金");
}<br>
复制代码
//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;
}
}
}<br>
复制代码
//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);
复制代码
总结
关于开放封闭原则,通过分析不同需求的用户去银行办理不同的业务来进行了三版实现,不知道大家写的代码是其中的哪一种呢?有何疑问,欢迎交流!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
继续阅读请点击广告
回复
使用道具
举报
返回列表
知者何南
+ 我要发帖
登录参与点评抽奖加入IT实名职场社区
下次自动登录
忘记密码?点此找回!
登陆
新用户注册
用其它账号登录:
关闭
快速回复
返回顶部
返回列表