职责链模式
定义:使多个对象都有机会处理请求,从而避免请求的发送者和接受者的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止
![image-20220407210742088](https://wxm-1305651098.cos.ap-guangzhou.myqcloud.com/img/20220407210742.png)
怎么实现呢?处理者拥有同样的处理行为即可,严格意义上说是方法名相同,而方法处理不相同,另外可以设置后继
处理者。后继处理者不在声明时设置,有利于更好的扩展。
区别于工厂模式,此模式是依次传递,而非跳跃传递
/**
* @author 州牧
* @description
* @since 2022-04-07 21:17
*/
public abstract class Handler {
protected Handler handler;
public void SetHandler(Handler handler){//设置后继处理者
this.handler = handler;
}
public abstract void handlerRequest(int args);//处理行为
}
/**
* @author 州牧
* @description
* @since 2022-04-07 21:18
*/
public class DemoHandler1 extends Handler{
@Override
public void handlerRequest(int args) {
if(args>0){
System.out.println("处理大于0的参数");
}else {
if(handler!=null)
handler.handlerRequest(args);
}
}
}
/**
* @author 州牧
* @description
* @since 2022-04-07 21:21
*/
public class DemoHandler2 extends Handler{
@Override
public void handlerRequest(int args) {
if(args == 0){
System.out.println("处理等于0");
}else {
if(handler!=null)
handler.handlerRequest(args);
}
}
}
/**
* @author 州牧
* @description
* @since 2022-04-07 21:22
*/
public class DemoHandlerN extends Handler{
@Override
public void handlerRequest(int args) {
if(args<0){
System.out.println("处理小于0的参数");
}else {
if(handler!=null)
handler.handlerRequest(args);
}
}
}
使用效果
public class Client {
public static void main(String[] args) {
Handler h1 = new DemoHandler1();
Handler h2 = new DemoHandler2();
Handler hn = new DemoHandlerN();
h1.SetHandler(h2);
h2.SetHandler(hn);
int[] arg = {1,0,-1};
for (int i : arg) {
h1.handlerRequest(i);
}
}
}
/*
处理大于0的参数
处理等于0
处理小于0的参数
*/
该模式优点是,可以随时低增加或修改处理一个请求的结构,增强了给对象指派职责的灵活性。
缺点:一个请求有可能经过整条链都没处理。