责任链模式(Chain of Responsibility Pattern)
背景介绍:
在小胖子的程序世界里,披萨店的制作流程中出现了一次意外。一份特殊口味的披萨制作出了问题,小胖子怀疑是在制作流程中的某个环节出了差错。为了找出责任所在,小胖子决定引入责任链模式,逐个排查每个步骤,找出问题的源头。
设计模式应用:
责任链模式
为了追踪问题的源头,小胖子决定引入责任链模式。他创建了一个责任链,每个披萨师傅负责制作流程中的一个环节。当一份披萨制作出了问题,责任链会逐个询问每个师傅,直到找到问题所在。
代码示例:
// 披萨问题类
class PizzaIssue {
private String description;
public PizzaIssue(String description) {
this.description = description;
}
public String getDescription() {
return description;
}
}
// 披萨师傅抽象类
abstract class PizzaMaker {
private PizzaMaker next;
public void setNext(PizzaMaker next) {
this.next = next;
}
public abstract void handleIssue(PizzaIssue issue);
public void handleNext(PizzaIssue issue) {
if (next != null) {
next.handleIssue(issue);
}
}
}
// 具体的披萨师傅类
class IngredientPreparation extends PizzaMaker {
@Override
public void handleIssue(PizzaIssue issue) {
if (issue.getDescription().contains("ingredient")) {
System.out.println("披萨师傅1:负责材料准备环节,发现问题:" + issue.getDescription());
} else {
handleNext(issue);
}
}
}
class SauceSpreading extends PizzaMaker {
@Override
public void handleIssue(PizzaIssue issue) {
if (issue.getDescription().contains("sauce")) {
System.out.println("披萨师傅2:负责酱料涂抹环节,发现问题:" + issue.getDescription());
} else {
handleNext(issue);
}
}
}
class ToppingsAdding extends PizzaMaker {
@Override
public void handleIssue(PizzaIssue issue) {
if (issue.getDescription().contains("toppings")) {
System.out.println("披萨师傅3:负责配料添加环节,发现问题:" + issue.getDescription());
} else {
handleNext(issue);
}
}
}
class BakingPizza extends PizzaMaker {
@Override
public void handleIssue(PizzaIssue issue) {
if (issue.getDescription().contains("baking")) {
System.out.println("披萨师傅4:负责披萨烘焙环节,发现问题:" + issue.getDescription());
} else {
handleNext(issue);
}
}
}
class SlicingPizza extends PizzaMaker {
@Override
public void handleIssue(PizzaIssue issue) {
if (issue.getDescription().contains("slicing")) {
System.out.println("披萨师傅5:负责披萨切片环节,发现问题:" + issue.getDescription());
} else {
handleNext(issue);
}
}
}
class Delivery extends PizzaMaker {
@Override
public void handleIssue(PizzaIssue issue) {
if (issue.getDescription().contains("delivery")) {
System.out.println("披萨师傅6:负责披萨交付环节,发现问题:" + issue.getDescription());
} else {
handleNext(issue);
}
}
}
// 客户端
public class ChainOfResponsibilityPatternExample {
public static void main(String[] args) {
// 构建责任链
PizzaMaker ingredientPreparation = new IngredientPreparation();
PizzaMaker sauceSpreading = new SauceSpreading();
PizzaMaker toppingsAdding = new ToppingsAdding();
PizzaMaker bakingPizza = new BakingPizza();
PizzaMaker slicingPizza = new SlicingPizza();
PizzaMaker delivery = new Delivery();
ingredientPreparation.setNext(sauceSpreading);
sauceSpreading.setNext(toppingsAdding);
toppingsAdding.setNext(bakingPizza);
bakingPizza.setNext(slicingPizza);
slicingPizza.setNext(delivery);
// 模拟披萨制作过程中的问题
PizzaIssue issue = new PizzaIssue("There is an issue with the ingredient preparation.");
// 从责任链的起点开始处理问题
ingredientPreparation.handleIssue(issue);
}
}
追踪问题源头
在这个例子中,责任链模式帮助小胖子追踪披萨制作过程中的问题源头。每个披萨师傅负责处理制作流程中的一个环节,当出现问题时,责任链会逐个询问每个师傅,直到找到问题所在。这种方式帮助小胖子快速定位问题并进行修复。