本来是昨天敲完上机的,但是看着U层上机的代码有四层循环,U层做了大部分B层的工作,于是就想到了设计模式去循环,看了很多巨人的博客,最终实现了。
首先回顾下职责链的内容:
职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象练成一条链,并沿着这条链传递该请求,直到有一个对象处理它为至。
Handler类:定义一个处理请示的接口
ConcreteHandler类:具体处理类,处理它所负责的请求,可访问它的后继者,如果可处理,则处理,否则交给下一个继续处理。
而在上机过程中
Handler类:判断用户是否可以上机
ConcreteHandler类:需要按照顺序满足,账号是否存在,余额是否充足,账号是否在上机三个要求后即可完成上机,这三个要求便是具体处理类
那么设计模式加在那一层:其实没有明确要求,根据情况而定,现在是做逻辑判断,因此加在了B层,接下来看代码
首先写一个抽象检查上机类也就是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层定义一个方法,这个方法由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;
}
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
总结:其实在重构中一定要弄懂七层登录是如何一条线传参,并且一条线返回,本质上就是与数据库打交道,也就是增删改查,这个很重要,之后的功能都是建立在这个上面,包括加设计模式!