C#机房重构-下机(职责链模式)

职责链模式

C#机房重构-下机(职责链模式)_第1张图片
职责链:当客户提交一个请求时,请求是沿着链传递,直至有一个ConcreteHandler对象负责处理,接收者和发送者都灭有对方的明确信息,且链中的对象自己也并不知道链的结构,仅需保持一个指向其后继者的引用。

具体实现

在机房重构中职责链主要用于确定学生的消费时间,以下为具体的实现:

抽象类

     public abstract class Handler//处理请求的抽象类
{
    protected Handler successor;
    public void SetSuccessor(Handler successor)
    {
        this.successor = successor;
    }
    public abstract Line_info GetcumeTime(Line_info line);
}

具体处理者类,处理它负责的请求,也可以访问它的后继者

//未到达准备时间+最少上机时间
public class Preparetime : Handler
{
    public override Line_info GetcumeTime(Line_info line)
    {
        double a = Convert.ToDouble(line.Leasttime) / 60;//获得带小数点的小时制时间
        double b = Convert.ToDouble(line.Preparttime) / 60;
        if (a + b > line.ConsumeTime)
        {
            line.ConsumeTime = 0;
        }
        else
        {
            successor.GetcumeTime(line);//转到下一位
        }
        return line;
    }
}

具体处理者类,处理它负责的请求,也可以访问它的后继者

//超过准备上机时间+最少上机时间的消费时间
public class Consumetime : Handler
{
    public override Line_info GetcumeTime(Line_info line)
    {

        double a = Convert.ToDouble(line.Leasttime) / 60;//获得带小数点的小时制时间
        double b = Convert.ToDouble(line.Preparttime) / 60;
        if (a + b < line.ConsumeTime)
        {
            line.ConsumeTime = line.ConsumeTime;
        }
        else
        {
            successor.GetcumeTime(line);
        }
        return line;
    }
}

BLL层

//调用职责链模式,计算花费时间 
//创建具体的处理对象,实例化时就将"对象的具体执行者"传过去
ChainModel.Preparetime preparetime = new ChainModel.Preparetime();
ChainModel.Consumetime consumtime = new ChainModel.Consumetime();
//从最开始的低层,设置上级
preparetime.SetSuccessor(consumtime);
//从链的最低层开始执行
Line_info line1 = preparetime.GetcumeTime(line);  
总结

认真了解一下职责链模式的UML图,实践起来并不难。对于大型的项目来说,还是要考虑该请求的末端,确保该请求在此链中最终得到处理。

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