凝练 责任链模式(5.1)

编程入门 行业动态 更新时间:2024-10-09 23:18:12

<a href=https://www.elefans.com/category/jswz/34/1748721.html style=凝练 责任链模式(5.1)"/>

凝练 责任链模式(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;//successorpublic 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 ConditionSystem.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)要求详细处理者①要么处理、要么传给下家,不得部分处理;②请求在责任链中必须被处理。

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


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



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

转载于:.html

更多推荐

凝练 责任链模式(5.1)

本文发布于:2024-02-06 10:41:06,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1748635.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:凝练   模式   责任

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!