介绍
今天介绍责任链模式,举个小美相亲的例子,假如小美想相亲,就叫大姑、舅舅、姐姐去帮她依次把关。他的3个亲人对相亲的小伙子有如下要求:
- 大姑:小伙子一定要能挣钱,工资必须高于5000,否则不行。
- 舅舅:小伙子不能太瘦,体重要超过110,否则保护不了小美。
- 姐姐:小伙一定要超过160,矮了不行。
- 小美:只要是男的就行。
上面的大姑、舅舅、姐姐三人组成了一个责任链,他们的责任是按照自己的要求帮小美把关,下面我画以下它的UML图
UML图
责任链关键一点是,自己依赖自己的接口。而最后一个判断者必须处理完业务,这里指的是小美。
代码
- 先创建一个小伙子类
public class Boy {
private int salary;
private int weight;
private int height;
public Boy(int salary, int weight, int height) {
this.salary = salary;
this.weight = weight;
this.height = height;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
}
- 这里模拟4个负责考察的Handler子类,其中包括必须最后处理者,小美自己。
package com.bridge.chain;
public abstract class Handler {
abstract String investigate(Boy boy);
}
class Aunt extends Handler{
private Handler handler;
public Aunt(Handler handler){
this.handler = handler;
}
@Override
String investigate(Boy boy) {
if(boy.getSalary() < 5000){
return "不行,工资太低了";
} else {
return handler.investigate(boy);
}
}
}
class Uncle extends Handler{
private Handler handler;
public Uncle(Handler handler){
this.handler = handler;
}
@Override
String investigate(Boy boy) {
if(boy.getWeight() < 110){
return "不行,保护不了小美";
} else {
return handler.investigate(boy);
}
}
}
class Syster extends Handler{
private Handler handler;
public Syster(Handler handler){
this.handler = handler;
}
@Override
String investigate(Boy boy) {
if(boy.getHeight() < 160){
return "不行,太矮了";
} else {
return handler.investigate(boy);
}
}
}
class Own extends Handler{
@Override
String investigate(Boy boy) {
return "可以,可以,都满足要求";
}
}
- 这里模拟相亲过程
public static void main(String[] args) {
Boy xm = new Boy(4000,120,155);//小明 工资 4000 第一关大姑就过不去
Boy xw = new Boy(5000,100,165);//小王 体重不够
Boy xl = new Boy(6000,120,155);//小刘 身高不够
Boy xg = new Boy(5000,125,175);//小顾 啥都满足
Own own = new Own();
Syster syster = new Syster(own);
Uncle uncle = new Uncle(syster);
Aunt aunt = new Aunt(uncle);
System.out.println("小明去相亲,结果为:");
System.out.println(aunt.investigate(xm));
System.out.println("小王去相亲,结果为:");
System.out.println(aunt.investigate(xw));
System.out.println("小刘去相亲,结果为:");
System.out.println(aunt.investigate(xl));
System.out.println("小顾去相亲,结果为:");
System.out.println(aunt.investigate(xg));
}
- 打印结果为:
小明去相亲,结果为:
不行,工资太低了
小王去相亲,结果为:
不行,保护不了小美
小刘去相亲,结果为:
不行,太矮了
小顾去相亲,结果为:
可以,可以,都满足要求
总结
- 在实际开发中,责任链模式非常常见,比如过滤器,或者Spring security的登录权限校验。
- 如果上面不用责任链的话,判断语句将使业务变得非常复杂,也不利于代码业务的增加
- 各个责任之间的判断也可以随业务类的不同,相互调换顺序