设计模式-行为设计模式:责任链模式 ResponsibilityChain

来源:互联网 发布:网络思想政治教育总结 编辑:程序博客网 时间:2024/05/24 01:37

责任链模式

对一个任务处理的过程中,可能有多个环节,申请的发起者只能找到一个入口,它不知道环节里面的东西,只需要一个结果,保证里面的处理类是按照顺序对它进行处理

责任链模式就是让节点之间自己把任务进行传递处理,并返回一个结果


责任链父类

    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);            }

结果:



0 0