何为职责链模式
使多个对象都有机会处理请求,从而避免请求的发起者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递改请求,直到有一个对象处理它为止。
优点:
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("请核对信息是否已上机 或余额不足"); } }