职责链(Chain of Responsibility)模式

职责链(Chain of Responsibility)模式:使多个对象都有机会处理请求,从而避免请求发送者呵接受者之间的耦合关系。

将这个对象连成一条链子,并沿着这条链传递该请求,知道有一个对象处理它。

/*
* 抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义出一个方法,以设定和返回对下家的引用。
    这个角色通常由一个抽象类或接口实现。
* 具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。
    由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。
*/

 

 

在抽象处理者(Handler) 设置继任者:

       protected Handler successor; 
        // 方法
        public void SetSuccessor(Handler successor)
        {
            this.successor = successor;
        }

以便于找到下一个人。

 

 // 设置链的责任
            Handler h1 = new ConcreteHandler1();
            Handler h2 = new ConcreteHandler2();
            Handler h3 = new ConcreteHandler3();
            h1.SetSuccessor(h2);
            h2.SetSuccessor(h3);

            // 生成和处理请求
            int[] requests = { 2, 5, 14, 22, 18, 3, 27, 20 };

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

            Console.WriteLine("\n==================\n");

    /// <summary>
    /// 抽象处理者(Handler)角色
    /// </summary>
    public abstract class Handler
    {
        
        protected Handler successor; 
        // 方法
        public void SetSuccessor(Handler successor)
        {
            this.successor = successor;
        }
        abstract public void HandleRequest(int request); 
    }

    /// <summary>
    /// 具体处理者1
    /// </summary>
    public class ConcreteHandler1 : Handler
    {
        //从写基类 方法
        public override void HandleRequest(int request)
        {
            if (request >= 0 && request < 10)
                Console.WriteLine("{0} handled request {1}",
                  this, request);
            else
                if (successor != null)
                    successor.HandleRequest(request);
        }

    }

    /// <summary>
    /// 具体处理者2
    /// </summary>
    public class ConcreteHandler2 : Handler
    {
        public override void HandleRequest(int request)
        {
            if (request >= 10 && request < 20)
                Console.WriteLine("{0} handled request {1}",
                  this, request);
            else
                if (successor != null)
                    successor.HandleRequest(request);
        }
    }

    // 具体处理者3
    class ConcreteHandler3 : Handler
    {
        public override void HandleRequest(int request)
        {
            if (request >= 20 && request < 30)
                Console.WriteLine("{0} handled request {1}",
                  this, request);
            else
                if (successor != null)
                    successor.HandleRequest(request);
        }
    }

 

posted @ 2014-06-16 19:53  dragon.net  阅读(203)  评论(0编辑  收藏  举报