CoR(Chain of Responsibility)
职责链设计模式
我在 两种 CoR(一)
中讨论了传统的CoR实现:
但我感觉 让 每个处理器都持有后继处理器的引用,会增加处理器之间的耦合度.
下面是我的一些想法 和 具体实现:
(1)处理器 不持有 后继处理器的引用,引入一个新的角色 处理器容器(HandlerContainer
)
,由容器管理每个处理器,并且这个处理器容器 也是一个处理器(实现了Handler
接口),他的处理能力是容器里所有处理器的处理能力的和。
(2)一个处理器如果不能处理传递过来的请求,则抛出一个(CanNotHandleRequestException
)异常,
如果管理这个处理器的容器接受到这个异常,则将请求传递给容器中的下一个处理器。如果容器中的所有处理器都不能处理这个请求,则由容器抛出一个(CanNotHandleRequestException
)异常。
实现:与传统CoR相比,处理器接口(Handler
)不变,请求接口(Request
)和实现类不变。
1,增加CanNotHandleRequestException
异常类,当处理器不能处理传递过来的请求时就抛出这个异常。
public class CanNotHandleRequestException extends Exception{
private static final long serialVersionUID = 1L;
}
2,增加处理器容器类(HandlerContainer
),处理器容器类也实现了处理器接口,他的处理能力是容器里所有处理器的处理能力的和。
public class HandlerContainer implements Handler{
private List<Handler> handlers;
public HandlerContainer(){
handlers = new ArrayList<Handler>();
}
public boolean add(Handler handler){
return this.handlers.add(handler);
}
public boolean remove(Handler handler){
return this.handlers.remove(handler);
}
public void handleRequest(Request request) throws CanNotHandleRequestException{
int length = this.handlers.size();
for(int i = 0 ; i < length ; i++){
Handler handler = handlers.get(i);
try {
handler.handleRequest(request);
break;
} catch (CanNotHandleRequestException e) {
/*
* 如果处理器容器里的所有处理器都不能处理该请求,
* 则由容器抛出 CanNotHandleRequestException 异常。
*/
if(i == length-1) throw e;
}
}
}
}
3,实现处理器接口的实现类
HelpHandler
,PrintHandler
,SaveHandler
HelpHandler
处理 帮助请求(HelpRequest
)
public class HelpHandler implements Handler{
public void handleRequest(Request request) throws CanNotHandleRequestException {
if(request instanceof HelpRequest){
System.out.println("HelpHandler handle "+request.getClass().getSimpleName());
}else
throw new CanNotHandleRequestException();
}
}
PrintHandler
处理 打印请求(PrintRequest
)
public class PrintHandler implements Handler{
public void handleRequest(Request request) throws CanNotHandleRequestException{
if(request instanceof PrintRequest){
System.out.println("PrintHandler handle "+request.getClass().getSimpleName());
}else{
throw new CanNotHandleRequestException();
}
}
}
SaveHandler
处理 保存请求(SaveRequest
)
public class SaveHandler implements Handler{
public void handleRequest(Request request) throws CanNotHandleRequestException{
if(request instanceof SaveRequest){
System.out.println("SaveHandler handle "+request.getClass().getSimpleName());
}else{
throw new CanNotHandleRequestException();
}
}
}
4,客户端 Client
类
public class Client {
public static void main(String[] args) throws CanNotHandleRequestException{
HandlerContainer Container1 = new HandlerContainer();
Container1.add(new HelpHandler());
HandlerContainer Container2 = new HandlerContainer();
Container2.add(new PrintHandler());
Container2.add(new SaveHandler());
Container1.add(Container2);
Container1.handleRequest(new HelpRequest());
Container1.handleRequest(new PrintRequest());
Container1.handleRequest(new SaveRequest());
}
}
运行Client
类,输出如下
HelpHandler handle HelpRequest
PrintHandler handle PrintRequest
SaveHandler handle SaveRequest
分享到:
相关推荐
当设计AGC电路时,我们可以选择两种控制模式:一种是通过外部输入实现VGA功能的模式,另一种是闭环控制,以实现AGC功能。在VGA模式下,电路可以根据外部控制电压来调节增益。而在闭环AGC模式下,反馈机制会根据信号...
在R中,我们可以使用`cor()`函数计算变量间的皮尔逊相关系数,这是一种衡量变量线性关系强度和方向的统计量。相关系数的值介于-1和1之间,正值表示正相关,负值表示负相关,而0表示没有线性关系。 要创建相关性图,...
LCD9648液晶显示器是一种常见的用于嵌入式系统和单片机应用的显示设备,其原理图提供了关于如何连接和驱动该显示器的详细信息。本文将深入解析LCD9648液晶显示器的工作原理和相关知识点。 首先,LCD9648的名字表明...
【描述】中提到的“埃斯克马尔布”可能是项目名称的另一种拼写或翻译,再次强调了项目的颜色处理主题。"Prime trabalho prático"与标题相呼应,重申这是课程的首次实践练习。描述还提到了“可以从DOM到COR或DOM的...
光纤激光的输出功率在十余年内迅速上升,目前连续输出的光纤激光功率已达千瓦以上。...另一种方法是加大光纤的纤芯直径,并用各种方法改进它的光束质量。对以上两种方法进行介绍,并给出一部分实验结果。
设计了一种三芯光子晶体光纤(PCFs)偏振分束器。利用光纤的谐振现象,实现了偏振状态的分离。当三芯光子晶体光纤中三个超模式的模式折射率满足一定条件时,将产生谐振现象。通过选择合适的光纤结构参数,可使某一偏振...
另一个需要注意的是异方差性,即误差项的方差随解释变量的变化而变化。可以使用`plot(model)$resid`和`scale(residuals(model))`结合来看,或者使用`plot(model, which = 2)`绘制残差与 fitted 值的散点图,以检查...
EDA是一种通过统计图形和计算来了解数据特性和结构的方法,旨在发现模式、异常值、相关性以及可能的假设检验。它通常在数据分析流程的早期阶段进行,帮助我们形成对数据的初步认识,为后续建模或决策提供基础。 在R...
- **data.frame**: 创建数据框,是一种特殊的列表,每一列可以是不同类型的向量。 **2. 向量操作** - **c**: 将多个对象连接成一个向量或列表。 - **length**: 求向量或列表的长度。 - **subset**: 通过条件选择...
感觉是同一文件,删除一个,对另一个没有影响;须两个都删除才算删除。 ln -s file1 file1.sln 创建软链接。可跨系统操作,冲破操作权限;也是快捷方式。 八、时间显示 date 显示时间,精确到秒 用法 date [-u]...