故事
传统if-else判断方式。
public class LeaveApproval {
public static void main(String[] args) {
ExpenseReimbursement maNiuApply = new ExpenseReimbursement();
maNiuApply.setName("Ma Niu");
maNiuApply.setAmount(-100);
if (maNiuApply.getAmount() < 0 ) {
System.out.println("Amount error!");
} else if (maNiuApply.getAmount() <= 500) {
projectManagerHandle(maNiuApply);
} else if (maNiuApply.getAmount() <= 1000) {
departmentManagerHandle(maNiuApply);
}else {
managingDirectorHandle(maNiuApply);
}
}
public static void projectManagerHandle(ExpenseReimbursement expense) {
System.out.println("Project manager approved " + expense.getAmount());
}
public static void departmentManagerHandle(ExpenseReimbursement expense) {
System.out.println("Department manager approved " + expense.getAmount());
}
public static void managingDirectorHandle(ExpenseReimbursement expense) {
System.out.println("Managing director approved " + expense.getAmount());
}
}
简介
责任链模式(Chain of Responsibility),又名职责链模式,是一种对象行为型模式。定义:为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。
责任链模式的本质是:将请求的发送者和请求的处理者解耦,让请求在处理链中能进行传递,由具体的处理者完成处理。
代码类图
抽象处理者(Handler):封装处理请求方法的接口,主要方法有:抽象处理方法和后继连接节点。
具体处理者(Concrete Handler):抽象处理者的具体实现。在抽象处理方法的实现中,判断是否处理本次请求。如果能处理就完成请求;如果不能处理就将请求传递给链上的下一个处理者。
客户类(Client):首先,创建各个具体处理者,并将他们组成处理链。之后,将请求提交给链头的具体处理者。
代码实现
public class ChainOfResponsibilityPattern {
public static void main(String[] args) {
//组装责任链
Handler handler1 = new ConcreteHandler1();
Handler handler2 = new ConcreteHandler2();
handler1.setNext(handler2);
//提交请求
handler1.handleRequest("two");
}
}
//抽象处理者角色
abstract class Handler {
private Handler next;
public void setNext(Handler next) {
this.next = next;
}
public Handler getNext() {
return next;
}
//处理请求的方法
public abstract void handleRequest(String request);
}
//具体处理者角色1
class ConcreteHandler1 extends Handler {
@Override
public void handleRequest(String request) {
if (request.equals("one")) {
System.out.println("ConcreteHandler1 handler!");
} else {
if (getNext() != null) {
getNext().handleRequest(request);
} else {
System.out.println("None handler!");
}
}
}
}
//具体处理者角色2
class ConcreteHandler2 extends Handler {
@Override
public void handleRequest(String request) {
if (request.equals("two")) {
System.out.println("ConcreteHandler2 handler!");
} else {
if (getNext() != null) {
getNext().handleRequest(request);
} else {
System.out.println("None handler!");
}
}
}
}
优点
缺点
应用场景
扩展
职责链模式存在以下两种扩展情况:
与装饰者模式的异同
思维导图