职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
在下机的时候,针对消费时间的不同相对应的就有不同的消费金额,那么就可以用职责链模式,根据消费时间的不同,是职责链对象在不同的消费时间的设定内进行传递,直到有满足条件时再返回处理。
可以在B层写一个职责链模式的类(Chain of Responsibility),也可以独立于七层写,这个类包含它的抽象方法Handler和它的子类方法。但是因为Void类型没有返回值,这样在UI层进行调用的时候就会出现“错误:“无法将“void”类型隐式转换为“string””。所以在实例化职责链各个子类的时候就要将它们写在一个“string”类型的方法中,这样可以在Facade层可以有返回值“string”,同时在UI层也就可以调用。
下面是代码展示。
B层:
public class Chain_of_Responsibility
{
//定义全局变量,消费总额:cashcount;
public static string cashcount;
//抽象方法;
public abstract class HandlerCash
{
//设置继任者successor;
protected HandlerCash successor;
public void Setsuccessor(HandlerCash successor)
{
this.successor = successor;
}
//在下机的时候要调用basic数据库表和line表里的数据,所有可以在抽象方法的参数中直接调用这两个实体层对象,
即:(Model.ModifyInfomationModel basictime, Model.OnlinestateModel time)
//抽象方法Cashcount;
public abstract void Cashcount(Model.ModifyInfomationModel basictime, Model.OnlinestateModel time);
}
//第一个继任者子类;
public class HandlerLeasttimecash : HandlerCash
{
public override void Cashcount(Model.ModifyInfomationModel basictime, Model.OnlinestateModel time)
{
//如果消费时间<=基本设定的时间,消费金额就是5元;
if (Convert.ToInt32(time.Consumetime) <= basictime.Leastonlinetime)
{
cashcount = basictime.LeastMoney.ToString();
}
else
{
//继任者的抽象方法,向下传递
successor.Cashcount(basictime, time);
}
}
}
//第二个继任者子类;
public class HandlerNormaltimecash : HandlerCash
{
public override void Cashcount(Model.ModifyInfomationModel basictime, Model.OnlinestateModel time)
{
//定义变量,便于相乘;
int consumecash = Convert.ToInt32(time.Consumecash);
//大于上机时间在优惠时间之内的价格,
int price = 8;
if (Convert.ToInt32(time.Consumetime) > basictime.Leastonlinetime && Convert.ToInt32(time.Consumetime) <= basictime.Recordtime1)
{
//上机时间大于最少上机时间,小于优惠时间时,
consumecash = Convert.ToInt32(time.Consumetime) * price;
cashcount = consumecash.ToString();
}
else
{
successor.Cashcount(basictime, time);
}
}
}
//第三个继任者子类;
public class HandlerRewordtimecash : HandlerCash
{
public override void Cashcount(Model.ModifyInfomationModel basictime, Model.OnlinestateModel time)
{
//优惠时间打八折;
double price = 6.4;
int consumetime = Convert.ToInt32(time.Consumetime);
int consumecash = Convert.ToInt32(time.Consumecash);
if (Convert.ToInt32(time.Consumetime) > basictime.Recordtime1)
{
consumecash = Convert.ToInt32(price) * consumetime;
cashcount = consumecash.ToString();
}
else
{
successor.Cashcount(basictime, time);
}
}
}
在这里写一个“string”方法,同时实例化各个子类,直接返回全局变量cashcount
//职责链模式的方法调用;
public string Responsibilitycashcost(Model.ModifyInfomationModel basictime, Model.OnlinestateModel time)
{
//实例化职责链的各个子类
HandlerLeasttimecash leasttime = new HandlerLeasttimecash();
HandlerNormaltimecash normaltime = new HandlerNormaltimecash();
HandlerRewordtimecash rewordtime = new HandlerRewordtimecash();
leasttime.Setsuccessor(normaltime);
normaltime.Setsuccessor(rewordtime);
//返回消费金额;
leasttime.Cashcount(basictime, time);
return cashcount;
}
Facade层:
//计算消费金额的方法,职责链模式;
public string Responsibilitycashcost(Model.ModifyInfomationModel basictime, Model.OnlinestateModel time)
{
Chain_of_Responsibility bllchain = new Chain_of_Responsibility();
return bllchain.Responsibilitycashcost(basictime, time);
}
UI层:
mode.Consumecash = facadeapart.Responsibilitycashcost(basictime, mode);