责任链模式,重点在链字的理解。想象一下自行车的链条,环环相扣。
比如有个程序外包群,里边有使用各种语言的程序猿。假设现在有一个指定了某种编程语言的需求,肯定谁会这种编程语言,谁就去接受这个需求。
但是客户又不想一个个的去问,怎么办?这时候,群主想了个办法,把这些程序员随机或者按照某种规则链起来,需求来了之后,客户只需要把需求给了链条最开始的一个人,就可以了。具体谁接受了这个需求,客户不需要知道。
话也不多说,直接代码见:
/**
* 定义抽象类,所有程序员的父类
*/
public abstract class Programmer {
private Programmer programmer;
public void setNextProgrammer(Programmer programmer) {
this.programmer = programmer;
}
public Programmer getNextProgrammer() {
return programmer;
}
public abstract void doProgram(String language);
}
public class GoProgrammer extends Programmer {
@Override
public void doProgram(String language) {
if ("go".equals(language)) {
System.out.println("使用go语言处理完了");
}else {
Programmer nextProgrammer = getNextProgrammer();
if (nextProgrammer != null) {
getNextProgrammer().doProgram(language);
}else {
System.out.println("需求在这里不能实现");
}
}
}
}
public class JavaProgrammer extends Programmer {
@Override
public void doProgram(String language) {
if ("java".equals(language)) {
System.out.println("使用java语言处理完了");
}else {
Programmer nextProgrammer = getNextProgrammer();
if (nextProgrammer != null) {
getNextProgrammer().doProgram(language);
}else {
System.out.println("需求在这里不能实现");
}
}
}
}
public class PHPProgrammer extends Programmer {
@Override
public void doProgram(String language) {
if ("php".equals(language)) {
System.out.println("使用php语言处理完了");
}else {
Programmer nextProgrammer = getNextProgrammer();
if (nextProgrammer != null) {
getNextProgrammer().doProgram(language);
}else {
System.out.println("需求在这里不能实现");
}
}
}
}
public class Main {
public static void main(String[] args) throws IOException {
//获取责任链
Programmer chain = getChain();
//提出各种需求
System.out.println("go 需求?");
chain.doProgram("go");
System.out.println("php 需求?");
chain.doProgram("php");
System.out.println("java 需求?");
chain.doProgram("java");
System.out.println("kotlin 需求?");
chain.doProgram("kotlin");
}
//群主帮忙排好序
public static Programmer getChain() {
Programmer java = new JavaProgrammer();
Programmer php = new PHPProgrammer();
Programmer go = new GoProgrammer();
java.setNextProgrammer(php);
php.setNextProgrammer(go);
return java;
}
}
结果:
go 需求?
使用go语言处理完了
php 需求?
使用php语言处理完了
java 需求?
使用java语言处理完了
kotlin 需求?
需求在这里不能实现