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


    一、简介(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…语句,它就是将这些判定条件的语句放到了各个处理类中,这样做的优点是比较灵活了,但同样也带来了风险, 比如设置处理类前后关系时,一定要特别仔细,搞对处理类前后逻辑的条件判断关系,并且注意不要在链中出现循环引用的问题。

     

     

     

     

  • 相关阅读:
    传真机换色带
    系统无法安装 OfficeControl.ocx 控件如何解决
    体系结构
    WebOffice 插件
    ArcMAP定义投影坐标
    如何在AutoCAD中将卫星底图变为有坐标参考信息的
    AutoCAD中导入图片
    CGCS2000坐标系与其他坐标系间的差异和转换方法
    FTP服务器(SOCKET)返回异常 500 Command not understood
    Java微信公众平台开发--番外篇,对GlobalConstants文件的补充
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3047753.html
Copyright © 2020-2023  润新知