机房重构——上机(职责链模式)

前言:

本来是昨天敲完上机的,但是看着U层上机的代码有四层循环,U层做了大部分B层的工作,于是就想到了设计模式去循环,看了很多巨人的博客,最终实现了。

首先回顾下职责链的内容:

职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象练成一条链,并沿着这条链传递该请求,直到有一个对象处理它为至。

机房重构——上机(职责链模式)_第1张图片

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

ConcreteHandler类:具体处理类,处理它所负责的请求,可访问它的后继者,如果可处理,则处理,否则交给下一个继续处理。

而在上机过程中

Handler类:判断用户是否可以上机

ConcreteHandler类:需要按照顺序满足,账号是否存在,余额是否充足,账号是否在上机三个要求后即可完成上机,这三个要求便是具体处理类

那么设计模式加在那一层:其实没有明确要求,根据情况而定,现在是做逻辑判断,因此加在了B层,接下来看代码

BLL层

首先写一个抽象检查上机类也就是Handler类

public abstract class CheckOnHandler
{
    protected CheckOnHandler successor;//定义一个handler类变量
    public void SetSuccessor(CheckOnHandler successor)//设置继任处理者
    {
        this.successor = successor;
    }

    public abstract bool HandleCheck(Entity.UserInfo user, Entity.Customer customer, Entity.OnlineEntity online);//处理上机的抽象方法

}

具体处理类——判断上机账号是否存在

public class CheckExitID : CheckOnHandler
{
    public override bool HandleCheck(Entity.UserInfo user, Entity.Customer customer, Entity.OnlineEntity online)
    {
        Factory.LoginFactory fact = new Factory.LoginFactory(); //实例化工厂
        IDAL.LoginIDAL idal = fact.CreateUser();//调用工厂方法创建接口
        DataTable table = idal.selectUser(user);//接受D层的返回值
        string state = table.Rows[0]["state"].ToString().Trim();
        bool flag;
        if (table.Rows.Count == 0||state =="已禁用")//返回的datatable类型,如果它的行数等于0,说明没有符合该账号密码的用户
        {
            flag = false;
            return flag;
        }
        else
        {
            return successor.HandleCheck(user, customer, online);
        }
    }
}

具体处理类——判断用户金额是否小于最小金额

public class CheckBalance : CheckOnHandler
{
    public override bool HandleCheck(Entity.UserInfo user, Entity.Customer customer, Entity.OnlineEntity online)
    {
        //查顾客表
        Factory.CustomerFactory fact = new Factory.CustomerFactory();
        IDAL.CustomerIDAL idal = fact.CreateCustomer();
        DataTable table = idal.selectCustomer(customer);

        //查基础数据表
        Factory.BasicdataFactory basicfact = new Factory.BasicdataFactory();
        IDAL.BasicdataIDAL basicidal = basicfact.SelectBasic();
        DataTable datatable = basicidal.SelectBasic();

        //判断余额是否大于最低余额
        int balance = Convert.ToInt32(table.Rows[0]["custBalance"]);
        int limitcash = Convert.ToInt32(datatable.Rows[0]["limitCash"]);

        bool flag;
        if (balance < limitcash)
        {
            flag = false;
            return flag;
        }
        else
        {
            return successor.HandleCheck(user, customer, online);
        }

    }
}

具体处理类——判断用户是否上机

public class CheckOnline : CheckOnHandler
{
    public override bool HandleCheck(Entity.UserInfo user, Entity.Customer customer, Entity.OnlineEntity online)
    {
        //查找上机表
        Factory.OnlineFactory fact = new Factory.OnlineFactory();
        IDAL.OnlineIDAL idal = fact.SelectOnline();
        DataTable table = idal.SelectOnline(online);
        bool flag;
        if (table.Rows.Count <= 0)
        {
            flag = true;
            return flag;
        }
        else
        {
            flag = false;
            return flag;
        }

    }
}

Facade层

对具体类实例化并设置职责链上家与下家(注意在Facade层定义一个方法,这个方法由UI层调用)

    public bool CheckOnline(Entity.UserInfo user, Entity.Customer customer, Entity.OnlineEntity online)
    {
        BLL.CheckExitID checkExitID = new BLL.CheckExitID();//实例化三个定义的具体处理类
        BLL.CheckBalance checkBalance = new BLL.CheckBalance();
        BLL.CheckOnline checkOnline = new BLL.CheckOnline();

        checkExitID.SetSuccessor(checkBalance);//设置上家与下家
        checkBalance.SetSuccessor(checkOnline);

        bool flag;
        flag = checkExitID.HandleCheck(user, customer, online);
        return flag;

    }

UI层

Entity.UserInfo userInfo = new Entity.UserInfo();
Entity.Customer customerinfo = new Entity.Customer();
Entity.OnlineEntity online = new Entity.OnlineEntity();                        
                       
bool result;
//传入参数
userInfo.UserID = txtUserID.Text.Trim();
userInfo.PassWord = txtPWD.Text.Trim();
customerinfo.CustID = txtUserID.Text.Trim();
online.CustID = txtUserID.Text.Trim();
//调用检查上机的方法
result = facade.CheckOnline(userInfo, customerinfo, online);
if (result==true )
{
    Facade.OnlineFacade onlineFacade = new Facade.OnlineFacade();
    Entity.OnlineEntity onlineEntity = new Entity.OnlineEntity();
    //添加到上机表,赋值我定义了全局变量
    onlineEntity.CustID = LoginUI.CustName;
    onlineEntity.OnDate = LoginUI.OnDate;
    onlineEntity.Balance = LoginUI.Balance;
    onlineEntity.Computer = System.Environment.MachineName;
    int res = onlineFacade.AddOnline(onlineEntity);
    frmMainCustomer frmMainCustomer = new frmMainCustomer();
    frmMainCustomer.Show();
    MessageBox.Show("上机成功", "提示");

}
else
{
    MessageBox.Show("该卡已停用或该卡该充值", "提示");
}

在给方法传参的时候,发现可以传入在某个方法不需要的参数,传入了三个表的用户ID

总结:其实在重构中一定要弄懂七层登录是如何一条线传参,并且一条线返回,本质上就是与数据库打交道,也就是增删改查,这个很重要,之后的功能都是建立在这个上面,包括加设计模式!

你可能感兴趣的:(#,C#)