责任链模式属于行为型设计模式中的一种。
责任链模式避免将发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并沿着这条链传递请求,直到有对象处理为止。

photo
Handler:传递者接口,定义一个处理请求的接口;实现链中下一个对象(可选)
ConcreteHandler:具体传递者,处理它所负责的请求;可以访问链中下一个对象,如果可以处理请求就处理它,否则将请求传递给下一个对象。
Client:客户端应用程序。

实际生活中的例子:
员工请假,部门经理可以批3天以下的假期,中心总监可批5天以下的假期,副总裁可批10天以下的假期,CEO可以批20天以下假期,超过20天需要开会决定。
示例:
// "Handler"
//传递者抽象类
  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 <= 3)
            {
                Console.WriteLine(" {1} 天假期已由部门经理批示",
                  this.GetType().Name, request);
            }
            else if (successor != null)
            {
                successor.HandleRequest(request);
            }
        }
    }

    // 中心总监

    class ConcreteHandler2 : Handler
    {
        public override void HandleRequest(int request)
        {
            if (request >= 4 && request < 6)
            {
                Console.WriteLine(" {1} 天假期已由中心总监批示",
                   this.GetType().Name, request);
            }
            else if (successor != null)
            {
                successor.HandleRequest(request);
            }
        }
    }

    //副总裁

    class ConcreteHandler3 : Handler
    {
        public override void HandleRequest(int request)
        {
            if (request >=6 && request < 11)
            {
                Console.WriteLine(" {1} 天假期已由副总裁批示",
                    this.GetType().Name, request);
            }
            else if (successor != null)
            {
                successor.HandleRequest(request);
            }
        }
    }
    //CEO
    class ConcreteHandler4 : Handler
    {
        public override void HandleRequest(int request)
        {
            if (request >= 11 && request < 21)
            {
                Console.WriteLine(" {1} 天假期已由CEO批示",
                    this.GetType().Name, request);
            }
            else if (successor != null)
            {
                successor.HandleRequest(request);
            }
        }
    }
    //开会决定
    class ConcreteHandler5 : Handler
    {
        public override void HandleRequest(int request)
        {
            if (request >=  21)
            {
                Console.WriteLine(" {1} 天假期需要开会决定",
                    this.GetType().Name, request);
            }
            else if (successor != null)
            {
                successor.HandleRequest(request);
            }
        }
    }

客户端调用
static void Main()
        {
            
            Handler h1 = new ConcreteHandler1();
            Handler h2 = new ConcreteHandler2();
            Handler h3 = new ConcreteHandler3();
            Handler h4 = new ConcreteHandler4();
            Handler h5 = new ConcreteHandler5();
            h1.SetSuccessor(h2);
            h2.SetSuccessor(h3);
            h3.SetSuccessor(h4);
            h4.SetSuccessor(h5);
            
            int[] requests = { 2, 5, 14, 22 };

            foreach (int request in requests)
            {
                h1.HandleRequest(request);
            }

           
            Console.Read();
        }

执行结果:
photo

相关文章

Write a comment:



(将显示你的Gravatar图标)  



[b][/b] - [i][/i] - [u][/u]- [quote][/quote]

:-/ ^_^ :d :o :kiss: :) :p :se: [yeah] :( :love: :han: :up: :cry: :zzz: o_o

暂时停止交换链接.

评论提交有问题?