先说一下机房收费系统中为什么要有消费时间计算这个问题,首先学生上机应该有一个准备时间,这段时间短短几分钟,可以不收费的;其次还要有一个最少上机时间,也就相当于打车时的起步价一样,收一个固定费用;再最后就是单位递增时间了,可以10分钟、30分钟或一小时等等,也就是多长时间给用户计算一次费用。
根据以上需求,这是一个依次递进的过程,准备时间——最少上机时间——单位递增时间,这样就形成了一条职责链。
职责链模式
使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,将这个对象连成一条链,并延着这条链传递该请求,直到有一个对象处理它为止。
好处:
1、职责链可简化对象的相互连接,它们仅需保持一个指向其后继者的引用,而不需保持它所有的候选接受者的引用,大大降低耦合度;
2、链的结构是在客户端来定义,可以随时增加或修改处理一个请求的结构,增强了给对象指派职责的灵活性。
结构图如下:
Handler类
public abstract class TimeHandler
{
protected TimeHandler successor;
//设置继任者
public void SetSuccessor(TimeHandler successor)
{
this.successor = successor;
}
//处理请求的抽象方法
public abstract int HandleTimeRequest(int time);
}
具体处理者类
public class LeastTimeHandler : TimeHandler //继承TimeHandler类
{
public override int HandleTimeRequest(int time)
{
BasicDataEntity BasicData = new BasicDataEntity(); //实例化一个实体类
Factory.FactoryDB factory = new Factory.FactoryDB(); //实例化工厂
IBasicData IBasicData = factory.CreateIBasicData(); //通过接口调用D层方法
List<BasicDataEntity> list = IBasicData.InquireBasicData(BasicData);
int leastTime = list[0].LeastTime;
if (time <= leastTime) //如果上机时间小于等于最少上机时间
{
return time;
}
else
{
return successor.HandleTimeRequest(time); //转移到下一位
}
}
}
public class UnitTimeHandler : TimeHandler //继承TimeHandler类
{
public override int HandleTimeRequest(int time)
{
BasicDataEntity BasicData = new BasicDataEntity(); //实例化一个实体类
Factory.FactoryDB factory = new Factory.FactoryDB(); //实例化工厂
IBasicData IBasicData = factory.CreateIBasicData(); //通过接口调用D层方法
List<BasicDataEntity> list = IBasicData.InquireBasicData(BasicData);
int unittime = list[0].UnitTime;
return time =Convert.ToInt32(Math.Ceiling((double)time / (double)unittime) * unittime);
}
}
调用:
public int CostTime(LineInfoEntity LineInfo, BasicDataEntity BasicData)
{
//实例化具体处理者类
LeastTimeHandler LeastTime = new LeastTimeHandler();
UnitTimeHandler AddTime = new UnitTimeHandler();
//设置职责链上家与下家
LeastTime.SetSuccessor(AddTime);
DateTime dt = LineInfo.OnDate + LineInfo.OnTime;
TimeSpan ts = DateTime.Now - dt;
int minute = Convert.ToInt32(ts.TotalMinutes);
//将消费时间交给职责链去处理
return LeastTime.HandleTimeRequest(minute);
}
其实这里只有一个最少上机时间判断,不去套用职责链模式会更加简单,但毕竟还是一只小菜鸟,能够去用、去学习还是有很大收获的,手中无剑、心中有剑的境界以后会慢慢达到的,加油!