职责链模式Chain of Responsibility
使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合。将这个对象连成一条链,并沿着这条俩传递该请求,直到有一个对象处理它为止
Handler:抽象处理者,定义抽象处理方法以及对下一个处理者的引用,一般为抽象类
ConcreteHandler:具体处理者,既能处理也能传递请求,持有下一个ConcreteHandler的引用
使用场景
多个对象对于同一个问题有着不同的处理方式。
发送者与接收者互相不认识,链中的对象也仅仅知道自己的下家,而不清楚整个链的具体结构,降低耦合
与状态模式
状态模式:状态模式是把原来类中的针对自身不同状态的行为独立出去,作为类,是一个类对于不同状态的多种不同响应,状态迁移的顺序已经决定,不允许客户端进行操作改变顺序
职责链模式是不同类对于一个问题的不同处理,责任类不需要知道自己的下一个类是什么可以;在客户端或环境类中对链进行组装,组合成不同的链更为灵活
最大区别:状态模式的子类仅仅能处理问题和改变环境类的状态属性,而不执行下个状态的方法(并不持有下个类的引用),由环境类执行方法; 而职责类中的每个类即负责处理问题,也负责递交问题(持有下个类引用,并调用其方法);
一个是从问题的角度,一个是从处理者的角度
与策略模式
责任链 :多个对象对于同一个问题有着不同的处理方式,使多个对象都有机会处理请求;
策略: 一个对象对于一个问题有着不同的处理方式,从而产生的多种算法。
状态:一个对象(问题)对于自身的状态产生不同的响应
实例
Handler:持有Handler引用,拥有用于设置下个链的方法
public abstract class Handler {
protected Handler nextHandler;
public void setNextHandler(Handler handler){
this.nextHandler = handler;
}
public abstract void HandlerRequest(int request);
}
ConcreteHandler:具体的处理行为
public class ConcreteHandlerA extends Handler{
@Override
public void HandlerRequest(int request) {
if (request<10){
System.out.println("A成功处理");
}else {
System.out.println("A不能处理 ,提交给下一级处理");
super.nextHandler.HandlerRequest(request);
}
}
}
public class ConcreteHandlerB extends Handler {
@Override
public void HandlerRequest(int request) {
if (request<20){
System.out.println("B成功处理");
}else {
System.out.println("B不能处理 ,提交给下一级处理");
super.nextHandler.HandlerRequest(request);
}
}
}
public class ConcreteHandlerC extends Handler{
@Override
public void HandlerRequest(int request) {
System.out.println("C处理");
}
}
Test:在客户端或环境类中为链组合
public class Test {
public static void main(String[] args) {
Handler h1 = new ConcreteHandlerA();
Handler h2 = new ConcreteHandlerB();
Handler h3 = new ConcreteHandlerC();
// 设置链
h1.setNextHandler(h2);
h2.setNextHandler(h3);
// 使用链处理问题
h1.HandlerRequest(30);
}
}