机房重构之职责链模式的应用

举报
小小张自由--张有博 发表于 2021/11/22 22:58:47 2021/11/22
【摘要】 目录 何为职责链模式 优点: 机房重构的应用 Handler父类,定义了一个处理请示的接口 ActivateHandler类,判断卡号密码是否正确 ActivateHandler1类,判断卡内余额是否大于0 OnlineHandler类,判断卡号是否上机 在外观层设置职责链的上下级关系 UI层直接调用Facade层的方...

目录

何为职责链模式

优点:

机房重构的应用

Handler父类,定义了一个处理请示的接口

ActivateHandler类,判断卡号密码是否正确

ActivateHandler1类,判断卡内余额是否大于0

OnlineHandler类,判断卡号是否上机

在外观层设置职责链的上下级关系

UI层直接调用Facade层的方法


何为职责链模式

使多个对象都有机会处理请求,从而避免请求的发起者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递改请求,直到有一个对象处理它为止。

优点:

1、降低耦合度。它将请求的发送者和接收者解耦。

2、简化了对象。使得对象不需要知道链的结构。

3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。

4、增加新的请求处理类很方便。

机房重构的应用

实现思路——将职责链用在了上机的过程,首先判断账号密码是否正确,若正确加判断卡内余额是否大于0,若大于0判断该卡号是否正在上机。若以上条件全部满足,上机成功!。

Handler父类,定义了一个处理请示的接口


  
  1. /// <summary>
  2. /// 上机的职责链
  3. /// 定义了一个处理请示的接口
  4. /// </summary>
  5. public abstract class Handler
  6. {
  7. protected Handler successor;
  8. /// <summary>
  9. /// 设置继任者
  10. /// </summary>
  11. /// <param name="successor"></param>
  12. public void SetSuccessor(Handler successor)
  13. {
  14. this.successor = successor;
  15. }
  16. /// <summary>
  17. /// 处理请求
  18. /// 子类都重写该方法
  19. /// </summary>
  20. /// <param name="Cardno">卡号</param>
  21. /// <param name="Password">密码</param>
  22. public abstract bool HandlerRequest(string Cardno,string Password);
  23. }

ActivateHandler类,判断卡号密码是否正确


  
  1. /// <summary>
  2. ///判断卡号密码是否正确
  3. /// </summary>
  4. public class ActivateHandler : Handler
  5. {
  6. public override bool HandlerRequest(string Cardno, string Password)
  7. {
  8. Factory.Client.LoginFactory factory = new Factory.Client.LoginFactory();//实例化工厂
  9. IDAL.Client.LoginIDAL idal = factory.Login();//调用工厂方法创建接口
  10. DataTable dt = idal.ClientLogin(Cardno, Password);//接收D层的返回值
  11. bool flag;
  12. //判断卡号密码是否正确
  13. if (dt.Rows.Count == 0)
  14. {
  15. //不正确
  16. return flag = false;
  17. }
  18. else
  19. {
  20. //正确
  21. return successor.HandlerRequest(Cardno, Password);
  22. }
  23. }
  24. }

ActivateHandler1类,判断卡内余额是否大于0


  
  1. /// <summary>
  2. /// 判断卡内余额是否大于0
  3. /// </summary>
  4. public class ActivateHandler1 : Handler
  5. {
  6. public override bool HandlerRequest(string Cardno, string Password)
  7. {
  8. Factory.Client.LoginFactory factory = new Factory.Client.LoginFactory();//实例化工厂
  9. IDAL.Client.LoginIDAL idal = factory.Login();//调用工厂方法创建接口
  10. DataTable dt = idal.ClientLogin(Cardno, Password);//接收D层的返回值
  11. /拿到卡号中的余额
  12. string strCash = dt.Rows[0][4].ToString();
  13. Decimal Cash = Decimal.Parse(strCash);
  14. //判断余额是否大于0
  15. bool flag;
  16. if (Cash>0)
  17. {
  18. //转移到下一位
  19. return successor.HandlerRequest(Cardno, Password);
  20. }
  21. else
  22. {
  23. return flag = false;
  24. }
  25. }
  26. }

OnlineHandler类,判断卡号是否上机


  
  1. /// <summary>
  2. /// 判断卡号是否已上机
  3. /// </summary>
  4. public class OnlineHandler : Handler
  5. {
  6. public override bool HandlerRequest(string Cardno, string Password)
  7. {
  8. //去Online表
  9. Factory.Client.LoginFactory2 factory2 = new Factory.Client.LoginFactory2();//实例化工厂
  10. IDAL.Client.SelectOnline idal2 = factory2.Login(); //调用工厂方法创建接口
  11. DataTable dt2 = idal2.SelectOnline(Cardno);//接收D层的返回值
  12. bool flag;
  13. //判断卡号是否上机
  14. if (dt2.Rows.Count == 0)
  15. {
  16. // 将上机信息写入Online,line表
  17. Factory.Client.LoginFactory3 factory3 = new Factory.Client.LoginFactory3();
  18. IDAL.Client.AlterData idal3 = factory3.Login();
  19. DataTable dt3 = idal3.AlterData(Cardno);
  20. return flag = true;
  21. }
  22. else
  23. {
  24. return flag = false;
  25. }
  26. }
  27. }

在外观层设置职责链的上下级关系


  
  1. /// <summary>
  2. /// 职责链模式的上机
  3. /// </summary>
  4. /// <param name="Cardno">卡号</param>
  5. /// <param name="Password">密码</param>
  6. /// <returns></returns>
  7. public bool LoginHandler(string Cardno,string Password)
  8. {
  9. //多态思想
  10. //实例化三个定义的具体处理类
  11. BLL.LoginHandlerBLL.Handler judgeNoAndPass = new BLL.LoginHandlerBLL.ActivateHandler();
  12. BLL.LoginHandlerBLL.Handler judgeCash = new BLL.LoginHandlerBLL.ActivateHandler1();
  13. BLL.LoginHandlerBLL.Handler judgeOnline = new BLL.LoginHandlerBLL.OnlineHandler();
  14. //设置上下级别
  15. judgeNoAndPass.SetSuccessor(judgeCash);
  16. judgeCash.SetSuccessor(judgeOnline);
  17. //接收最后的布尔值
  18. bool flag;
  19. flag = judgeNoAndPass.HandlerRequest(Cardno, Password);
  20. return flag;
  21. }

UI层直接调用Facade层的方法


  
  1. private void btnOK_Click(object sender, EventArgs e)
  2. {
  3. Entity.Information.UserID = txtUserName.Text.Trim();
  4. string Cardno = txtUserName.Text.Trim();
  5. string Password = txtPassword.Text.Trim();
  6. Facade.Client.LoginFacade facade = new Facade.Client.LoginFacade();
  7. bool mark;
  8. //职责链模式上下机的过程
  9. mark = facade.LoginHandler(Cardno,Password);
  10. if (mark)
  11. {
  12. MessageBox.Show("欢迎使用","提示",MessageBoxButtons.OK,MessageBoxIcon.Warning);
  13. frmClientMain frm = new frmClientMain();
  14. this.Hide(); //本窗体隐藏
  15. rm.Show();
  16. }
  17. else
  18. {
  19. MessageBox.Show("请核对信息是否已上机 或余额不足");
  20. }
  21. }

博文至此,关于职责链模式应用就写完了,如果本篇博客对您有一定的帮助,大家记得留言+点赞哦。

文章来源: blog.csdn.net,作者:小小张自由—>张有博,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/promsing/article/details/108389123

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。