内容抄自《设计模式》清华大学出版社,2011
模式动机:
客户端无须关心请求的处理细节以及请求的传递,只需将请求发送到链上即可,将请求的发送者和处理者解耦
模式定义:
避免请求发送者和接收者耦合在一起,将这些对象连接成一条链,并沿着这条链传递请求,
直到有对象处理它为止。
结构分析:
包含角色:
1.Handler(抽象处理者)
2.ConcreteHandler(具体处理者)
模式分析:
public abstract class Handler{
protected Handler next;
public abstract void opreation();
}
public class ConcreteHandler extends Handler{
@Overrides
public void opreation(){
if(xxx) do;
else this.next.opreation();
}
}
优点:
1.降低耦合度:使得一个对象无须知道是谁处理该请求。
2.简化对象的相互连接。
3.增加给对象指派职责的灵活性
缺点:
1.不能保证请求一定被接收
2.增加复杂性,不方便调试,可能会造成死循环
适用环境:
1.有多个对象可以处理一个请求,具体哪个对象处理该请求由运行时刻自动确定
2.在不明确指定接收者的情况下,自动寻找。
3.可以动态指定一组对象处理请求。
栗子:
public class Example {
static abstract class User{
protected User next;
public void setNext(User next) {
this.next = next;
}
public abstract void check(Leave leave);
}
static class ZongJian extends User{
@Override
public void check(Leave leave) {
if(leave.day<5){
System.out.println("总监审批了");
}
else{
this.next.check(leave);
}
}
}
static class JingLi extends User{
@Override
public void check(Leave leave) {
if(leave.day<10){
System.out.println("经理审批了");
}
else{
this.next.check(leave);
}
}
}
static class LaoBan extends User{
@Override
public void check(Leave leave) {
if(leave.day<15){
System.out.println("老板审批了");
}
else{
System.out.println("你他妈是不是想辞职");
}
}
}
static class Leave{
public int day;
public String name;
public Leave(int day, String name) {
this.day = day;
this.name = name;
}
}
public static void main(String[] args) {
User user1 = new ZongJian();
User user2 = new JingLi();
User user3 = new LaoBan();
user1.setNext(user2);
user2.setNext(user3);
user1.check(new Leave(15,"小明"));
}
}