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

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

何为职责链模式

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


优点:

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("请核对信息是否已上机 或余额不足");
   }
}

相关文章
|
7天前
|
云安全 监控 安全
|
13天前
|
机器学习/深度学习 人工智能 自然语言处理
Z-Image:冲击体验上限的下一代图像生成模型
通义实验室推出全新文生图模型Z-Image,以6B参数实现“快、稳、轻、准”突破。Turbo版本仅需8步亚秒级生成,支持16GB显存设备,中英双语理解与文字渲染尤为出色,真实感和美学表现媲美国际顶尖模型,被誉为“最值得关注的开源生图模型之一”。
1355 8
|
6天前
|
人工智能 安全 前端开发
AgentScope Java v1.0 发布,让 Java 开发者轻松构建企业级 Agentic 应用
AgentScope 重磅发布 Java 版本,拥抱企业开发主流技术栈。
436 13
|
18天前
|
人工智能 Java API
Java 正式进入 Agentic AI 时代:Spring AI Alibaba 1.1 发布背后的技术演进
Spring AI Alibaba 1.1 正式发布,提供极简方式构建企业级AI智能体。基于ReactAgent核心,支持多智能体协作、上下文工程与生产级管控,助力开发者快速打造可靠、可扩展的智能应用。
1236 43
|
18天前
|
人工智能 前端开发 算法
大厂CIO独家分享:AI如何重塑开发者未来十年
在 AI 时代,若你还在紧盯代码量、执着于全栈工程师的招聘,或者仅凭技术贡献率来评判价值,执着于业务提效的比例而忽略产研价值,你很可能已经被所谓的“常识”困住了脚步。
1090 86
大厂CIO独家分享:AI如何重塑开发者未来十年
|
14天前
|
存储 自然语言处理 测试技术
一行代码,让 Elasticsearch 集群瞬间雪崩——5000W 数据压测下的性能避坑全攻略
本文深入剖析 Elasticsearch 中模糊查询的三大陷阱及性能优化方案。通过5000 万级数据量下做了高压测试,用真实数据复刻事故现场,助力开发者规避“查询雪崩”,为您的业务保驾护航。
630 32