设计模式在之前学习了两遍,尤其是在软考的时候,博主算是认认真真搞懂了十几个设计模式,虽然不算多,但是目前够用。然而这些都只存在理论阶段,还没有实战应用。但是最近博主在开发机房收费系统的时候发现学生下机计算消费时间这一块和职责链模式很相像,于是就把职责链模式加了上去,最后结果告诉我,还不错。
首先先来回顾一下什么是职责链模式?
职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一个链,并沿着这条链传递该请求,知道有一个对象处理它为止。
根据这个定义,我联想到了计算学生下机的过程。如果学生上机时间<至少上机时间,消费时间为0,如果学生上机时间>至少上机时间,按照计费标准收费。所以职责链模式解决的问题是确定消费时间属于哪个时间段。
好了有了这个思路,开始实现代码。
我的职责链模式的代码是在业务逻辑层(BLL)写的,这样方便调用。
//设置抽象父类
public abstract class Handler
{
protected Handler successor;
public void SetSuccessor(Handler successor) //设置继任者
{
this.successor = successor;
}
//处理请求的抽象方法
public abstract void HandlerRequest(BasicData_Info basicData,Line_Info line);
}
//如果上机时间<至少上机时间,消费时间为0计算
public class prepareTimeHandler : Handler
{
public override void HandlerRequest(BasicData_Info basicData,Line_Info line)
{
if (Convert.ToDouble(line.ConsumeTime)<=Convert.ToInt32(basicData.LeastTime))
{
line.ConsumeTime = 0.ToString();
}
else if(successor!=null)
{
successor.HandlerRequest(basicData,line);
}
}
}
//如果上机时间>至少上机时间,按照计费标准收费
public class leastTimeHandler:Handler
{
public override void HandlerRequest(BasicData_Info basicData,Line_Info line)
{
if (Convert.ToInt32(line.ConsumeTime) > Convert.ToInt32(basicData.LeastTime))
{
line.ConsumeTime = line.ConsumeTime;
}
else if(successor!=null)
{
successor.HandlerRequest(basicData,line);
}
}
}
外观层(Facade)设置职责链的上下继承者。
public void ConsumeTime(BasicData_Info basicData, Line_Info line)
{
BLLOnline.prepareTimeHandler prepareTimeHandler = new BLLOnline.prepareTimeHandler();
BLLOnline.leastTimeHandler leastTimeHandler = new BLLOnline.leastTimeHandler();
//设置职责链的上下家
leastTimeHandler.SetSuccessor(prepareTimeHandler);
//职责链的首家开始提交请求
prepareTimeHandler.HandlerRequest(basicData,line);
}
U层使用职责链模式计算消费时间。
//使用职责链模式
FacadeOnline facadePrepareTime = new FacadeOnline();
facadePrepareTime.ConsumeTime(basicdataSet, line);
认真了解职责链模式之后,站在巨人的肩膀上,会发现这个问题原来是挺好解决的。