当前位置 博文首页 > 小小张自由—>张有博:机房重构之职责链模式的应用

    小小张自由—>张有博:机房重构之职责链模式的应用

    作者:[db:作者] 时间:2021-09-14 19:46

    目录

    何为职责链模式

    优点:

    机房重构的应用

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

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

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

    OnlineHandler类,判断卡号是否上机

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

    UI层直接调用Facade层的方法


    何为职责链模式

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

    优点:

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

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

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

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

    机房重构的应用

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

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

    /// <summary>
    /// 上机的职责链
    /// 定义了一个处理请示的接口
    /// </summary>
    public  abstract class Handler
    {
        protected Handler successor;
        /// <summary>
        /// 设置继任者
        /// </summary>
        /// <param name="successor"></param>
        public void SetSuccessor(Handler successor)
        {
            this.successor = successor;
        }
    
        /// <summary>
        /// 处理请求
        /// 子类都重写该方法
        /// </summary>
        /// <param name="Cardno">卡号</param>
        /// <param name="Password">密码</param>
        public abstract bool  HandlerRequest(string Cardno,string Password);
    }

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

    /// <summary>
    ///判断卡号密码是否正确
    /// </summary>
    public class ActivateHandler : Handler
    {
        public override bool  HandlerRequest(string Cardno, string Password)
        {
             Factory.Client.LoginFactory factory = new Factory.Client.LoginFactory();//实例化工厂
             IDAL.Client.LoginIDAL idal = factory.Login();//调用工厂方法创建接口
             DataTable dt = idal.ClientLogin(Cardno, Password);//接收D层的返回值
    
             bool flag;
    
             //判断卡号密码是否正确
             if (dt.Rows.Count == 0)
             {
                  //不正确
                  return flag = false;
             }
                else
                {
                    //正确
                    return successor.HandlerRequest(Cardno, Password);
                }
        }
    }

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

    /// <summary>
    /// 判断卡内余额是否大于0
    /// </summary>
    public class ActivateHandler1 : Handler
    {
        public override bool HandlerRequest(string Cardno, string Password)
        {
            Factory.Client.LoginFactory factory = new Factory.Client.LoginFactory();//实例化工厂
            IDAL.Client.LoginIDAL idal = factory.Login();//调用工厂方法创建接口
            DataTable dt = idal.ClientLogin(Cardno, Password);//接收D层的返回值
    
            /拿到卡号中的余额
            string strCash = dt.Rows[0][4].ToString();
            Decimal Cash = Decimal.Parse(strCash);
    
            //判断余额是否大于0
            bool flag;
            if (Cash>0)
            {
               //转移到下一位
               return successor.HandlerRequest(Cardno, Password);
                    
            }
            else
            {
                    return flag = false;
            }
        }
    }

    OnlineHandler类,判断卡号是否上机

    /// <summary>
    /// 判断卡号是否已上机
    /// </summary>
    public class OnlineHandler : Handler
    {
        public override bool HandlerRequest(string Cardno, string Password)
        {
            //去Online表
            Factory.Client.LoginFactory2 factory2 = new Factory.Client.LoginFactory2();//实例化工厂
            IDAL.Client.SelectOnline idal2 = factory2.Login(); //调用工厂方法创建接口
            DataTable dt2 = idal2.SelectOnline(Cardno);//接收D层的返回值
    
            bool flag;
            //判断卡号是否上机
            if (dt2.Rows.Count == 0)
            {
                // 将上机信息写入Online,line表
                Factory.Client.LoginFactory3 factory3 = new Factory.Client.LoginFactory3();
                IDAL.Client.AlterData idal3 = factory3.Login();
                DataTable dt3 = idal3.AlterData(Cardno);
                return  flag = true;
    
            }
                else
                {
                   return flag = false;
                }
            }
    }

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

    /// <summary>
    /// 职责链模式的上机
    /// </summary>
    /// <param name="Cardno">卡号</param>
    /// <param name="Password">密码</param>
    /// <returns></returns>
    public bool LoginHandler(string Cardno,string Password)
    {
          //多态思想
          //实例化三个定义的具体处理类
          BLL.LoginHandlerBLL.Handler judgeNoAndPass = new BLL.LoginHandlerBLL.ActivateHandler();
          BLL.LoginHandlerBLL.Handler judgeCash = new BLL.LoginHandlerBLL.ActivateHandler1();
          BLL.LoginHandlerBLL.Handler judgeOnline = new BLL.LoginHandlerBLL.OnlineHandler();
    
          //设置上下级别
          judgeNoAndPass.SetSuccessor(judgeCash);
          judgeCash.SetSuccessor(judgeOnline);
    
          //接收最后的布尔值
          bool flag;
          flag = judgeNoAndPass.HandlerRequest(Cardno, Password);
          return flag;
    
    }

    UI层直接调用Facade层的方法

    private void btnOK_Click(object sender, EventArgs e)
    {
     
        Entity.Information.UserID = txtUserName.Text.Trim();
        string Cardno = txtUserName.Text.Trim();
        string Password = txtPassword.Text.Trim();
               
        Facade.Client.LoginFacade facade = new Facade.Client.LoginFacade();
        bool mark;
    
        //职责链模式上下机的过程
        mark = facade.LoginHandler(Cardno,Password);
       
       if (mark)
       {
            MessageBox.Show("欢迎使用","提示",MessageBoxButtons.OK,MessageBoxIcon.Warning);
            frmClientMain frm = new frmClientMain();
            this.Hide(); //本窗体隐藏
            rm.Show();
                    
       }
       else
       {
            MessageBox.Show("请核对信息是否已上机 或余额不足");
       }
    
    }

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

    cs
    下一篇:没有了