责任链模式
对一个任务处理的过程中,可能有多个环节,申请的发起者只能找到一个入口,它不知道环节里面的东西,只需要一个结果,保证里面的处理类是按照顺序对它进行处理
责任链模式就是让节点之间自己把任务进行传递处理,并返回一个结果
责任链父类
public abstract class BaseLian
{
public BaseLian _baselian;
public abstract void Do(Animal house);
}
下面3个子类 分别继承上面的父类,并且重写了Do方法,当发现自己解决不了之后,如果有下一级操作,会自动转送给下一级进行处理
/// <summary>
/// 只能居住体积小于等于10的动物
/// </summary>
public class SmallHouse:BaseLian
{
public SmallHouse()
{
Console.WriteLine("{0}开始测量......",this.GetType().ToString());
}
public override void Do(Animal animal)
{
if (animal.Size <= 10)
{
animal.Node = "1";
animal.house = this.GetType().ToString();
}
else
{
if (this._baselian != null)
{
//没权限,需要向上级提交 看上级是否可以居住
Console.WriteLine("{0}住不下,去别的地方看看吧", this.GetType().ToString());
base._baselian.Do(animal);
}
else
{
//没有更大的了
Console.WriteLine("没有更大的了");
}
}
}
}
/// <summary>
/// 只能居住体积小于等于20的动物
/// </summary>
public class MediumHouse:BaseLian
{
public MediumHouse()
{
Console.WriteLine("{0}开始测量......",this.GetType().ToString());
}
public override void Do(Animal animal)
{
if (animal.Size <= 20)
{
animal.Node = "1";
animal.house = this.GetType().ToString();
}
else
{
if (this._baselian != null)
{
//没权限,需要向上级提交 看上级是否可以居住
Console.WriteLine("{0}住不下,去别的地方看看吧", this.GetType().ToString());
base._baselian.Do(animal);
}
else
{
//没有更大的了
Console.WriteLine("没有更大的了");
}
}
}
}
/// <summary>
/// 只能居住体积小于等于30的动物
/// </summary>
public class BigHouse:BaseLian
{
public BigHouse()
{
Console.WriteLine("{0}开始测量......",this.GetType().ToString());
}
public override void Do(Animal animal)
{
if (animal.Size <= 30)
{
animal.Node = "1";
animal.house = this.GetType().ToString();
}
else
{
if (this._baselian != null)
{
//没权限,需要向上级提交 看上级是否可以居住
Console.WriteLine("{0}住不下,去别的地方看看吧", this.GetType().ToString());
base._baselian.Do(animal);
}
else
{
//没有更大的了
Console.WriteLine("没有更大的了");
}
}
}
}
设置一个动物类
public class Animal
{
public int ID { get; set; }
public string Name { get; set; }
public int Size { get; set; }
/// <summary>
/// 是否找到居住点 0正在寻找 1找到了 2未找到
/// </summary>
public string Node { get;set; }
public string house { get; set; }
}
调用
//创建一个动物
Animal animal = new Animal()
{
ID=1,
Name="咩咩",
Node="0",
Size=12
};
BaseLian xiao = new SmallHouse();
BaseLian zhong = new MediumHouse();
BaseLian da = new BigHouse();
//为小房子添加中房子为下一级
xiao._baselian = zhong;
//为中房子添加下一级为大
zhong._baselian = da;
//把动物放进去
xiao.Do(animal);
//检查动物状态
if (animal.Node == "2")
{
Console.WriteLine("太大了,没地方住");
}
else {
Console.WriteLine("{0}住在了{1}里面",animal.Name,animal.house);
}
结果: