机房合作-职责链模式实现用户登陆

简介: 机房合作-职责链模式实现用户登陆

职责链模式实现用户登陆

一、概念

①什么是职责链模式

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

简单理解:每一个对象都包含一类判断,将这个对象连成一条链,设置先后顺序,让请求沿着链传递,直到有一个对象能够处理为止。

②如何使用职责链模式(chain of responsibility)

设置多个具体的职责类,并且形成一条链,实例化时需要设置后继者。

③什么时候使用职责链模式

当涉及到条件判断的时候就可以考虑使用。

④为什么要使用职责链模式

由于每一个类都可以是一个判断,使用职责链模式可以解决大量分支判断造成难以维护,灵活性差的问题。

二、类图



三、实战 使用职责链模式实现登陆

①类图



实现代码

HandlerLgoin类

 public   abstract  class HandlerLogin
    {
        protected HandlerLogin successor;
        /// <summary>
        /// 设置继承者
        /// </summary>
        /// <param name="successor">子链名</param>
        public void  SetSuccessor(HandlerLogin successor)
        {
            this.successor = successor;
        }
        //请求处理的抽象方法
        public abstract void HandlerRequest(CustomerModel customer);
    }

PassWordHandler类

public class PassWordHandler:HandlerLogin
    { /// <summary>
      /// //判断账户和密码是否正确
      /// </summary>
      /// <param name="customer">查询返回的实体</param>
      /// <returns></returns>
        public override void  HandlerRequest(CustomerModel customer )
        {
            if (customer==null )
            {
                throw new Exception("账号或密码错误,请重新输入");
            }
            else
            {
                //执行下一个类的方法并返回值
                successor.HandlerRequest(customer );
            }
        }
    }

ActivationHandler类

 public class ActivationHandler:HandlerLogin
    { /// <summary>
      /// 判断用户是否激活
      /// </summary>
      /// <param name="customer">实体</param>
      /// <returns></returns>
        public override void  HandlerRequest(CustomerModel customer)
        {
            if (customer.activation=="已激活")
            {
                 successor.HandlerRequest(customer);
            }
            else
            {
                throw new Exception("账户未激活,请联系工作人员进行激活");
            }
        }
    }

OnlineHandler类

public class OnlineHandler:HandlerLogin 
    {   /// <summary>
        /// 判断用户是否正在上机
        /// </summary>
        /// <param name="customer">实体</param>
        /// <returns></returns>
        public override void  HandlerRequest(CustomerModel customer)
        {
            if (customer.loginStatus=="正在上机")
            {
                throw new Exception("用户正在上机,无需登录");
            }
            else
            {
                //执行下一个类的方法并返回值
                successor.HandlerRequest(customer);
            }
        }
    }

ActivationHandler类

public class ActivationHandler:HandlerLogin
    {   /// <summary>
        /// 判断用户是否激活
        /// </summary>
        /// <param name="customer">实体</param>
        /// <returns></returns>
        public override void  HandlerRequest(CustomerModel customer)
        {
            if (customer.activation=="已激活")
            {
                 successor.HandlerRequest(customer);
            }
            else
            {
                throw new Exception("账户未激活,请联系工作人员进行激活");
            }
        }
    }

业务逻辑层

public class CustomerLoginBLL
    {
        //实例化一个WCF服务代理
        DateBaseServiecClient client = new DateBaseServiecClient();
        /// <summary>
        /// 查询用户信息,利用职责链模式进行判断是否满足相应条件
        /// </summary>
        /// <param name="id">账号</param>
        /// <param name="passWord">密码</param>
        public void  SelectCustomerInfo(string id,string passWord)
        {
            //通过WCF服务代理调用D层接口
           CustomerModel customer= client.SelectCustomerInfo(id ,passWord);
            StaticCustomer.iD = id ;
            StaticCustomer.pWD = passWord;
            StaticCustomer.dateTimeOn = DateTime.Now;
            //实例化职责类
            Handler.PassWordHandler passWordHandler = new Handler.PassWordHandler();
            Handler.ActivationHandler activationHandler = new Handler.ActivationHandler();
            Handler.OnlineHandler onlineHandler = new Handler.OnlineHandler();
            Handler.BalanceHandler balanceHandler = new Handler.BalanceHandler();
            //设置上下级
            passWordHandler.SetSuccessor(activationHandler);
            activationHandler.SetSuccessor(onlineHandler);
            onlineHandler.SetSuccessor(balanceHandler);
            //设置职责链开始节点
            passWordHandler.HandlerRequest(customer);
        }
目录
相关文章
|
2月前
|
监控 安全 物联网
不会代码,中小企业管理员如何实现巡逻巡更系统
在现代安全管理中,园区、物业和工厂的巡逻巡更至关重要。本文对比了草料二维码、诺怀云系统和邦巡系统三款主流巡逻巡更系统,分析了它们的技术集成、系统复杂度、移动办公与物联网支持、价格与成本等方面的特点,帮助用户选择最适合的解决方案。草料二维码适合低成本、快速部署的中小企业;诺怀云系统适合需要全面移动协同办公的物业管理公司;邦巡系统则适合需要全场景、多业务、高效率巡检协作的企业。
|
算法
机房合作-策略模式实现用户充值
机房合作-策略模式实现用户充值
77 1
|
安全 NoSQL Redis
老板:公司系统太多,能不能实现账号互通?(二)
老板:公司系统太多,能不能实现账号互通?(二)
老板:公司系统太多,能不能实现账号互通?(二)
|
存储 消息中间件 安全
老板:公司系统太多,能不能实现账号互通?(一)
最近开发新产品,然后老板说我们现在系统太多了,每次切换系统登录太麻烦了,能不能做个优化,同一账号互通掉。作为一个资深架构狮,老板的要求肯定要满足,安排!
老板:公司系统太多,能不能实现账号互通?(一)
|
机器学习/深度学习 区块链
工厂不上云,等死!上云不上链,找死!
工厂不上云,等死!上云不上链,找死!
1003 0
SAP是如何与外界沟通的?
翻译一篇文章吧,官方的helphttps://help.sap.com/saphelp_nw70/helpdata/EN/36/020d3a0154b909e10000000a114084/frameset.htm?spm=a2c4e.11153940.blogcont684880.7.34e919ce4rOmikComponents of SAP Communication TechnologySAP通信交互技术在SAP的环境下,用ABAP代码写的经典的技术,和非ABAP开发的结构,二者互相通信,双向的通信,这种需求十分丰富。
1784 0
|
调度 数据库 数据库管理
|
安全 网络协议
黑客如何接管银行的所有在线业务?
本文讲的是黑客如何接管银行的所有在线业务?,入侵银行的传统模式与抢劫银行的老式方法没有太大的区别,其流程无非是——盗贼进来,获取财务,最后溜出去。但是,一个针对巴西银行实施攻击的黑客似乎采取了更为全面和迂回的做法:一个周末的下午,攻击者通过域名劫持的手段,将所有银行在线客户重定向到虚假的银行网站,轻松地获取了他们的帐户信息。
1827 0