大话设计模式-职责链模式

一:定义

职责链模式(Chain of Responsibility):使多个对象都有机会处理这个请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到一个对象处理它为止。image.png

二:优点

将if判断删除,把这些判断放到了子类里,降低了代码的耦合程度.当客户提交一个请求时,请求沿着链传递,一直到某个子类对象负责处理.注意的是职责链要在父类里定义继任者,然后客户段调用的时候给出调用的顺序.

 三:代码

abstract class Handler
    {
        protected Handler successor;
        public void SetSuccessor(Handler successor)
        {
            this.successor = successor;
        }

        public abstract void HandleRequest(int request);            //这里是处理请求的抽象方法
    }

    class ConcreteHandler1 : Handler            //第一种具体处理的方法
    {
        public override void HandleRequest(int request)
        {
            if (request >= 0 && request < 10)
            {
                Console.WriteLine("{0}处理请求{1}", this.GetType().Name, request);
            }
            else if (successor != null)
            {
                successor.HandleRequest(request);           //如果请求不在0-10之间,且不为空,则转移到下一位,职责链的体现。
            }
        }
    }

    class ConcreteHandler2 : Handler
    {
        public override void HandleRequest(int request)
        {
            if (request >= 10 && request < 20)
            {
                Console.WriteLine("{0}处理请求{1}", this.GetType().Name, request);
            }
            else if (successor != null)
            {
                successor.HandleRequest(request);           //如果请求不在10-20之间,且不为空,则转移到下一位,职责链的体现。
            }

        }
    }
    class ConcreteHandler3 : Handler
    {
        public override void HandleRequest(int request)
        {
            if (request >= 20)
            {
                Console.WriteLine("{0}处理请求{1}", this.GetType().Name, request);
            }
        }
    }
     static void Main(string[] args)
        {
            string FileValue = ConfigurationManager.AppSettings["num"];     //根据配置文件key值读取value值
            string[] StringArray = FileValue.Split(',');            //将字符串按照,号分割
            List<Handler> handlerlist = new List<Handler>();        //创建一个Handler类型的list列表
            for (int i = 0; i < StringArray.Length; i++)        //执行一次添加一个对象
            {
                handlerlist.Add ( DataAccess.CreteHandler(StringArray[i]));     //循环一次就往集合里添加一个对象类    
             
            }
            handlerlist[0].SetSuccessor(handlerlist[1]);
            handlerlist[1].SetSuccessor(handlerlist[2]);        //设置了职责链的上下家

           int[] requests = { 2, 5, 14, 22, 18, 3, 27, 20 };

           foreach (int request in requests)       //从requests这个数组里每次取一个int类型的数
           {
             handlerlist[0].HandleRequest(request);
           }

          Console.Read();
        }

猜你喜欢

转载自blog.csdn.net/hlzdbk/article/details/119281483
今日推荐