职责链模式实现用户登陆
一、概念
①什么是职责链模式
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); }