1. 概述
《三国演义》是中国一部经典的历史小说,描述了中国三国时期的政治、军事和人物传记。在小说中,有很多复杂的业务流程需要处理,比如说兵部尚书蒯越提督赤壁之战,需要依次通知各位将领并按照他们的权限执行任务。这种处理业务流程的设计模式被称为责任链模式。
2. 责任链模式
责任链模式是一种链式结构的设计模式,将请求对象沿着处理链进行传递,直到有一个处理者能够处理请求。责任链模式典型的应用场景是业务流程处理,比如请假申请、机票退订、网上购物等。
2.1 模式结构
责任链模式的主要角色包括:请求对象、处理者对象和处理链。请求对象封装了请求信息,处理者对象执行请求处理逻辑并返回处理结果,处理链按照一定的顺序组织处理者对象构成链式结构。
public abstract class Handler {
protected Handler successor;
public void setSuccessor(Handler successor) {
this.successor = successor;
}
public abstract Result handleRequest(Request request);
}
public class ConcreteHandlerA extends Handler {
@Override
public Result handleRequest(Request request) {
if (canHandle(request)) {
return handle(request);
} else if (successor != null) {
return successor.handleRequest(request);
} else {
return null;
}
}
private boolean canHandle(Request request) {
// 判断是否可以处理请求
}
private Result handle(Request request) {
// 处理请求
}
}
2.2 模式应用
在《三国演义》中,我们可以将蒯越提督赤壁之战的任务看做是一个请求对象,各位将领则是处理者对象,依次按照任务等级和权限进行处理。这个过程可以使用责任链模式来实现。
首先定义一个处理者抽象类Handler
,该抽象类包含一个后续处理者引用successor
和一个抽象处理请求方法handleRequest(Request request)
。具体处理者对象ConcreteHandlerA
继承Handler
抽象类并实现抽象方法handleRequest(Request request)
,在对请求进行处理前首先判断是否可以处理该请求,如果不是则交给下一个后继处理者进行处理。这个过程可以通过setSuccessor(Handler successor)
方法设置后继处理者,handleRequest(Request request)
方法递归调用后继处理者的handleRequest(Request request)
方法实现。
public abstract class Handler {
protected Handler successor;
public void setSuccessor(Handler successor) {
this.successor = successor;
}
public abstract Result handleRequest(Request request);
}
public class ConcreteHandlerA extends Handler {
@Override
public Result handleRequest(Request request) {
if (canHandle(request)) {
return handle(request);
} else if (successor != null) {
return successor.handleRequest(request);
} else {
return null;
}
}
private boolean canHandle(Request request) {
// 判断是否可以处理请求
}
private Result handle(Request request) {
// 处理请求
}
}
3. 实现过程
在实现《三国演义》中蒯越提督赤壁之战的任务处理时,可以定义一个请求对象Task
,请求对象包含两个属性,分别是任务等级level
和任务内容content
。定义一个抽象处理者Commander
,该类包含一个抽象方法execute(Task task)
,在实现类ConcreteCommanderA
和ConcreteCommanderB
分别处理不同等级的任务,并在构造方法中设置后继处理者实现责任链模式。可以看到,ConcreteCommanderB
没有设置后继处理者,因为赤壁之战中智略大于武力,没有将领可以胜任他的任务。
public class Task {
private int level;
private String content;
public Task(int level, String content) {
this.level = level;
this.content = content;
}
public int getLevel() {
return level;
}
public String getContent() {
return content;
}
}
public abstract class Commander {
protected Commander successor;
public Commander(Commander successor) {
this.successor = successor;
}
public abstract void execute(Task task);
}
public class ConcreteCommanderA extends Commander {
public ConcreteCommanderA(Commander successor) {
super(successor);
}
@Override
public void execute(Task task) {
if (task.getLevel() == 1) {
// 处理任务
} else if (successor != null) {
successor.execute(task);
}
}
}
public class ConcreteCommanderB extends Commander {
public ConcreteCommanderB() {
super(null);
}
@Override
public void execute(Task task) {
if (task.getLevel() == 2) {
// 处理任务
}
}
}
4. 测试结果
在主方法中,创建一个请求对象task
,并创建处理者对象commanderA
和commanderB
,将commanderA
对象设置为commanderB
对象的后继处理者。调用execute(Task task)
方法,该方法会沿着责任链逐级处理任务,直到有一个处理者可以处理该任务。
Task task = new Task(1, "蒯越提督赤壁之战");
Commander commanderA = new ConcreteCommanderA(new ConcreteCommanderB());
Commander commanderB = new ConcreteCommanderB();
commanderA.execute(task);
5. 总结
责任链模式是一种经典的设计模式,适用于处理业务流程较为复杂的业务场景。在《三国演义》中,我们可以将蒯越提督赤壁之战的任务处理看做是一个典型的责任链模式应用场景。使用责任链模式可以将各个处理者对象按照一定的顺序组织成链式结构,按照该结构处理任务,提高代码的复用性和可维护性。