您的位置:首页 > 其它

设计模式(二十一)—职责链模式(行为型)

2013-04-27 18:50 204 查看

一、简介(Brief Introduction)

使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。




二、模式分析(Analysis)



Handler: 抽象处理者:定义出一个处理请求的接口。如果需要,接口可以定义出一个方法,以设定和返回对下家的引用。这个角色通常由一个抽象类或接口实现。

ConcreteHandler: 具体处理者:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。

Client: 客户端

三、案例分析(Example)

namespace 职责链模式

{

1、客户端

class Program
    {
        static void Main(string[] args)
        {
            Handler h1 = new ConcreteHander1();
            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.Read();
        }
    }


2、Handler类,定义一个处理请示的接口

abstract class Handler
    {
        protected Handler successor;
        public void SetSuccessor(Handler successor)
        {
            this.successor = successor;
        }
        public abstract void HandleRequest(int request);
    }
3、ConcreteHandler类

class ConcreteHander1 : 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);
            }
        }
    }

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

        }
    }

    class ConcreteHandler3 : Handler
    {
        public override void HandleRequest(int request)
        {
            if(request >=20 && request<30)
            {
                 Console.WriteLine("{0} 处理请求 {1}", this.GetType().Name, request);
            }
            else if(successor!=null)
            {
                successor .HandleRequest (request );
            }
        }
    }
}


四、解决的问题(What To Solve)

•有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。

•在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。

•可动态指定一组对象处理请求。

五、优缺点(Advantage and Disadvantage)

优点:

• 降低耦合度

• 可简化对象的相互连接

• 增强给对象指派职责的灵活性

• 增加新的请求处理类很方便

缺点

•不能保证请求一定被接收。

•系统性能将受到一定影响,而且在进行代码调试时不太方便;可能会造成循环调用。

责任链模式与if…else…相比,他的耦合性要低一些,因为它把条件判定都分散到了各个处理类中,并且这些处理类的优先处理顺序可以随意设定。责任链模 式也有缺点,这与if…else…语句的缺点是一样的,那就是在找到正确的处理类之前,所有的判定条件都要被执行一遍,当责任链比较长时,性能问题比较严 重。

六、扩展(Extend)

职责链可以是一条直线、一个环或者一个树形结构,最常见的职责链是直线型,即沿着一条单向的链来传递请求。

链上的每一个对象都是请求处理者,职责链模式可以将请求的处理者组织成一条链,并使请求沿着链传递,由链上的处理者对请求进行相应的处理,

客户端无须关心请求的处理细节以及请求的传递,只需将请求发送到链上即可,将请求的发送者和请求的处理者解耦。这就是职责链模式的模式动机。

七、总结(Summary)

责任链模式其实就是一个灵活版的if…else…语句,它就是将这些判定条件的语句放到了各个处理类中,这样做的优点是比较灵活了,但同样也带来了风险, 比如设置处理类前后关系时,一定要特别仔细,搞对处理类前后逻辑的条件判断关系,并且注意不要在链中出现循环引用的问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: