职责链模式

1.概述

职责链模式(Chain of Responsibility Pattern):避免将一个请求的发送者与接受者耦合在一起,让多个对象都有机会处理请求。将接受请求的对象接成一条链,并且沿着这条链传递请求,直到有一个对象能够处理它为止。

职责链可以是一条直线,一个环或者树形结构,常见的是直线型,即沿着一条单向的链来传递请求。客户无需关心请求的处理细节以及请求的传递,只需将请求发送到链上。将请求的发送者和处理者解耦,是职责链模式的动机。

又称:责任链模式,是一种对象行为型模式。

2.结构

(1)Handler(抽象处理者):它定义了一个处理请求的接口,一般设计为抽象类,由于不同的具体处理者处理请求的方式不同,因此在其中定义了抽象请求处理方法。每一个处理者的下家还是一个处理者,故在抽象处理者中定义了一个抽象处理者类型的对象作为其对下家的引用,通过该引用,处理者可以连成一条链。

(2)ConcreteHandler(具体处理者):它是抽象处理者的子类,可以处理用户请求,实现了抽象处理方法。处理之前要进行判断,看看是否有相应的处理权限,若有则处理请求,若无则转发请求给下家。

3.实现

namespace ChainOfResponsibility
{
    public abstract class Handler
    {
        protected Handler successor;
        public void SetSuccessor(Handler successor)
        {
            this.successor = successor;
        }
        public abstract void HandleRequest(string request);
    }
    public class ConcreteHandlerA : Handler
    {
        public override void HandleRequest(string request)
        {
            //--如果满足条件
            if (string.IsNullOrEmpty(request))
            {
                //--处理请求
            }
            else
            {
                successor.HandleRequest(request);
            }
        }
    }
    public class ConcreteHandlerB : Handler
    {
        public override void HandleRequest(string request)
        {
            //-
        }
    }
    public class Client
    {
        public void UseMethod()
        {
            Handler handlerA = new ConcreteHandlerA();
            Handler handlerB = new ConcreteHandlerB();
            handlerA.SetSuccessor(handlerB);
            handlerA.HandleRequest("A");
        }
    }
}

纯的职责链模式要求一个具体的处理者对象只能在两个行为中选择一个:要么承担全部责任,要么将责任推给下家,不允许出现某一个具体处理者承担了一部分或者全部责任后又将责任向下传递。而且一个请求必须被某一个处理者所接受,不能出现某个请求未被任何一个处理者对象处理的情况。

不纯的职责链模式,允许某个请求被一个具体处理者部分处理后向下传递,或者一个具体处理者处理完某个请求后其后续处理者可以继续处理改请求,而且一个请求可以最终不被任何处理者对象接受并处理。

4.优缺点

(1)使得一个对象无须知道是其他哪一个对象处理了其请求,仅需知道该请求会被处理即可,接受者和发送者都没有对方的明确信息,切链中对象不需要知道链的结构,由客户端负责链的创建,降低了系统的耦合度。

(2)处理者对象仅仅需要维持一个指向后续处理者的引用,不需维持所有候选处理者的引用,简化了对象之间的相互连接。

(3)在给对象分配职责时,职责链可以带来更多的灵活性,可以通过在运行时对改链进行动态的增加或修改来增加或改变处理一个请求的职责。

(4)在系统中增加处理者无需修改原有代码,只需在客户端重新建链即可,符合开闭原则。

(1)由于一个请求没有明确的接受者,那么就不能保证它一定会被处理,可能一直到链的末端都得不到处理;一个请求也可能因为职责链没有创建正确而到不到处理。

(2)对于较长的职责链,请求处理时涉及多个对象,系统性能将受影响,调试也不方便。

(3)建链不当,可能造成循环调用,系统陷入死循环。

你可能感兴趣的:(C#设计模式,学习笔记)