责任链模式
责任链模式定义如下:
使得多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。
将这些对象连城一条链子,并且沿着这个条链子传递该请求,知道有对象处理它为止。
例子: 用户注册时,普通用户和vip用户注册采用不同的方式,因此需要不同处理者进行处理。
此模式重点是“链”
通用类图如下:
Handler:多个处理者的抽象类 抽象处理者
CommonRegisterv、VIPRegisterv:普通和vip注册用户 具体处理者
RegistevAction :注册具体内容
例子如下:
public abstract class Handler {
protected static final int level1= 1;
protected static final int level2 = 2;
private Handler nextHhandler;
private int level;
public Handler(int level) {
this.level = level;
}
public final void handleReuest(RegistevAction registevAction) {
if (this.level == registevAction.getRegisterLevel()) {
this.response(registevAction);
} else if (this.nextHhandler != null) {
this.nextHhandler.handleReuest(registevAction);
} else {
System.out.println("此路不通...");
}
}
protected void setNext(Handler handler) {
this.nextHhandler = handler;
}
protected abstract void response(RegistevAction registevAction);
}
public class CommonRegisterv extends Handler {
public CommonRegisterv() {
super(Handler.level1);
}
public void response(RegistevAction registevAction){
registevAction.registerContent();
System.out.println("这里是普通注册通道,通过 ...");
}
}
public class VIPRegisterv extends Handler {
public VIPRegisterv() {
super(Handler.level2);
}
public void response(RegistevAction registevAction){
registevAction.registerContent();
System.out.println("这里是VIP注册通道:通过...");
}
}
public class RegistevAction {
private int registerLevel;
private String registerContent;
public RegistevAction(int registerLevel, String registerContent){
this.registerLevel = registerLevel;
this.registerContent = registerContent;
}
public int getRegisterLevel(){
return registerLevel;
}
public void registerContent(){
System.out.println("注册内容:registerLevel:" + registerLevel+", registerContent:" + registerContent +"!");
}
}
public class Main {
private static final String CONTENT1 = "我是普通用户,我要注册...";
private static final String CONTENT2 = "我是VIP用户,我要注册...";
private static final String CONTENT3 = "我是路过打酱油的...";
public static void main(String[] args) {
Handler commonReg = new CommonRegisterv();
Handler vipReg = new VIPRegisterv();
commonReg.setNext(vipReg);
List<RegistevAction> intArr = new ArrayList<>();
intArr.add(new RegistevAction(1,CONTENT1));
intArr.add(new RegistevAction(2,CONTENT2));
intArr.add(new RegistevAction(2,CONTENT2));
intArr.add(new RegistevAction(1,CONTENT1));
intArr.add(new RegistevAction(3,CONTENT3));
intArr.add(new RegistevAction(2,CONTENT2));
for(RegistevAction registevAction : intArr){
commonReg.handleReuest(registevAction);
}
}
}
结果如下:
注册内容:registerLevel:1, registerContent:我是普通用户,我要注册...!
这里是普通注册通道,通过 ...
注册内容:registerLevel:2, registerContent:我是VIP用户,我要注册...!
这里是VIP注册通道:通过...
注册内容:registerLevel:2, registerContent:我是VIP用户,我要注册...!
这里是VIP注册通道:通过...
注册内容:registerLevel:1, registerContent:我是普通用户,我要注册...!
这里是普通注册通道,通过 ...
此路不通...
注册内容:registerLevel:2, registerContent:我是VIP用户,我要注册...!
这里是VIP注册通道:通过...
分析:
这个例子中,抽象的处理者Handler主要有三个职责:
1. 定义一个请求的处理方法handleReuest,这是一个唯一对外开发的接口,其中final表示,此方法不可以被覆盖
2. 定义一个链的排列方式setNext,也就是这个下一个处理者
3. 定义请求的具体实现response
可以看到,其实责任链模式和递归很像...
优点:实现请求和处理分开
缺点:链子较长时,存在性能问题
参考文献《设计模式之禅》