• 凝练 责任链模式(5.1)


    学生离开是一种典型表现责任链模式(Chain of Responsibility pattern)逼真的场景。

    学生通常留给辅导员,按照休假的天数如几个不同的类、几天、一个月、年份等。辅导员可能想咨询自己或医院党委副书记、秘、。

    责任链模式可以称为“推卸”式的代理。多个对象可以处理客户发出的请求,即它们都具有对应的方法如handle()。

    经典责任链

    责任链模式中,多个处理者对象将构成某种数据结构。详细的数据结构能够是单向链、单向环、双向链或树。

    不论构成什么结构,对全部处理者的抽象。正如数据结构中经常使用的结点概念。

    结点是自引用的,它含有一个或多个本类型的成员变量。例程6-1中,IHandler是全部处理者对象的抽象。

    它含有一个本类型的成员变量。准备构成简单的单向链;方法handle(int day) 定义了处理请求的接口。例程6-1中还提供了默认实现。

    详细处理者(ConcreteHandler)角色。假定辅导员、院党委副书记、书记、学校校长分别为H1、H2、H3和H4。先实现H1和H2。他们依照自己的权限处理请求,否则採用父类的默认实现。

    例程 6 1 简单的责任链
    package structure.chain;
    public abstract class IHandler{
        private IHandler next;//successor
        public void setNext(IHandler next){
            this.next = next;
        }
        public void handle(int day){
            if (next != null){
                next.handle(day);
            }else{System.out.println("no handler");}
        }
    }
    package structure.chain;
    public class H2 extends IHandler{
        @Override public void handle(int day){
            if (day<=6 && day>1){//some Condition
                System.out.println("ok! Handler is "+this.getClass().getName());
            }else{
                super.handle(day);
            }
        }
    }
    package structure.chain;
    import tool.God;
    public class Student{
        public static void test(int x){
            IHandler h2 =(IHandler)God.create("6-1-1-H2");
            IHandler h1 =(IHandler)God.create("6-1-1-H1");
            h1.setNext(h2);
            h1.handle(x);
        }
    } 

    BlueJ中測试,随着输入的不同,如1、2、10,输出分别为:

    ok! Handler is structure.chain.H1

    ok! Handler is structure.chain.H2

    no handler


    责任链模式将一个请求的处理者设计为一个链。链上的每一个类都能够处理这个请求,或者将处理责任踢皮球给下家。

    责任链的“链”表示处理流程的走向,H1、H2、H3和H4本身的详细数据结构能够是单向链、单向环或树。一个典型的应用。就是处理者构成组合模式的树形结构,而将请求/责任沿着树形结构的某种路径,向上或向下传递。

    在例程6-1中基础上。有若干细节问题能够展开讨论和想象

    l        请求者向谁提出请求?例程中展示的是,学生能够向责任链上任一处理者提出请求,由于Student 仅依赖IHandler,而详细的对象是由配置文件配置。你也能够指定学生仅仅能够向处理权限最低的辅导员提出请求。

    l        处理权限大小问题:请求能够依照处理权限从低到高的方式上交,也能够依照分段(权限平行)的方式或向下授权的方式处理。例程中演示的,事实上是分段的方式。

    l        请求必需被处理吗?例程中演示的,请求能够被责任链处理或不处理。假设要求“请求在责任链中必须被处理”,能够在抽象类IHandler中给出默认处理方案作为底线。而不是官僚主义地给出"nohandler"。

    l        谁指定自己的兴许结点?本例中IHandler的子类没有指定自己的兴许结点。

    抽象类的next设计private而非其它訪问权限。子类除了自己的处理代码。其它就交给super.handle(day)。

    针对上述细节问题的不同回答,可以给出责任链的不同变体

    比如。依照一般的想象,客户Student是不清楚职责链的处理流程(链的结构)和处理方式的。所以測试代码中指定职责链的兴许结点的工作,通常由某个管理类(ChainManager)或详细结点类自己完毕。

    由详细结点类指定兴许结点时。就须要考虑处理权限大小问题和传递方向。再比如,[GoF]定义的责任链模式,称为经典责任链(classic Chain ofResponsibility)要求详细处理者①要么处理、要么传给下家,不得部分处理;②请求在责任链中必须被处理。

    实际应用中,是否可以变通呢?


    太多的变体。以至于临时都我不想逐一的讨论了。



    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    swiper插件的使用demo
    可能要用的东西
    VIDEO
    vue上传图片加水印
    图片 base64 file blob 之间相互的转化
    vant 上传图片加水印
    JS 随机排序算法
    ubuntu16.04 下apache 搭建站点
    Unity常用目录对应的Android && iOS平台地址
    IOS 官方实现单例模式
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4832830.html
Copyright © 2020-2023  润新知