首页 > 代码库 > 职责链(Chain of Responsibility)模式

职责链(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);        }    }