[设计] 责任链模式
场景
雷达的数据有时候需要抽析有时候要做一些处理,有时间不要,一句话也就是代码中会出现很多的if else 语句。这时候一但再修改会带来很大的工作量。
常见的写法就是写呗,if else if else …
解决办法
- 我们把所有的不同条件下的处理都分布到不同的类中,那样我们如果添加条件也就是添加一个类这样就符全设计原则了。
- 我们要先确定一下条件处理的对像类也就是请求处理的对象。也就是有一些特殊属性的数据
- 我们把所有的不同条件下的处理都分布到不同的类中,那样我们如果添加条件也就是添加一个类这样就符全设计原则了。
public class RequestDeal
{
public int DataLength { get; set; }
public RequestDeal(int length)
{
DataLength = length;
}
}
- 我们添加一个处理类的基类
public abstract class DealBase
{
public DealBase NextDeal { get; set; }
public string FlagStr { get; set; }
public DealBase(string str)
{
FlagStr = str;
}
public abstract void DealData(RequestDeal rd);
}
- 我们这里以长度为标记,实例化两个字类一个小于15的一个大于15的。
public class LessThan : DealBase
{
public LessThan(string str):base(str)
{
}
public override void DealData(RequestDeal rd)
{
if (rd.DataLength<15)
{
Console.WriteLine("小于15不做处理责任人:{0}",FlagStr);
}
else
{
Console.WriteLine("大于要做处理了");
NextDeal.DealData(rd);
}
}
}
public class MoreThan : DealBase
{
public MoreThan(string str):base(str)
{
}
public override void DealData(RequestDeal rd)
{
if (rd.DataLength>15)
{
Console.WriteLine("处理了责任人:{0}", FlagStr);
}
}
}
- 这时我们可以这样使用,我们指清楚每个条件的下个处理对像之后就可以做对应的处理了。
static void Main(string[] args)
{
RequestDeal rdmin = new RequestDeal(7);
RequestDeal rdmax = new RequestDeal(17);
DealBase dbmin = new LessThan("小于15");
DealBase dbmax = new MoreThan("大于15");
dbmin.NextDeal = dbmax;
dbmin.DealData(rdmin);
dbmin.DealData(rdmax);
Console.Read();
}
注意
可能会产生一些其它的小类需要维护。
难点就是新增加一些处理可能要修改的东西比较多。
还有就是责任链过长性能也会成为一个问题
不能保证请求一定会被接收
源码
原文地址
* 在编码设计中的问题,没有什么是加一层不能解决的。*