一、定义
职责链模式使多个对象都有机会处理,从而避免请求的发送者和接受者之间的耦合关系。将这个对象形成一条链,直到有一个对象处理他为止。
二、框架运用
过滤器就是运用的职责链的设计思路
三、实战
1、抽象父类
public abstract class Manager {
private String name;
protected Manager superManager;
public Manager(String name) {
this.name = name;
}
public void setSuper(Manager superManager) {
this.superManager = superManager;
}
abstract void handler(Integer integer);
}
2、实现类
public class FirstManager extends Manager {
public FirstManager(String name) {
super(name);
}
@Override
void handler(Integer integer) {
System.out.println("我是一把手,处理所有的事情");
}
}
public class SecondManager extends Manager {
public SecondManager(String name) {
super(name);
}
@Override
void handler(Integer integer) {
if (2==integer){
System.out.println("我是二把手只处理integer=2的事情");
}else {
if (null!=superManager){
superManager.handler(integer);
}
}
}
}
public class ThirdManager extends Manager {
public ThirdManager(String name) {
super(name);
}
@Override
void handler(Integer integer) {
if (3==integer){
System.out.println("我是三把手只处理integer=3的事情");
}else {
if (null!=superManager){
superManager.handler(integer);
}
}
}
}
3、运行类和结果
public class Client {
public static void main(String[] args) {
Manager first = new FirstManager("一把手");
Manager second = new SecondManager("二把手");
Manager third = new ThirdManager("三把手");
second.setSuper(first);
third.setSuper(second);
System.out.println("----------------------");
second.handler(2);
System.out.println("----------------------");
second.handler(1);
System.out.println("----------------------");
third.handler(3);
System.out.println("----------------------");
third.handler(2);
System.out.println("----------------------");
third.handler(1);
System.out.println("----------------------");
}
}
Connected to the target VM, address: '127.0.0.1:57004', transport: 'socket'
----------------------
我是二把手只处理integer=2的事情
----------------------
我是一把手,处理所有的事情
----------------------
我是三把手只处理integer=3的事情
----------------------
我是二把手只处理integer=2的事情
----------------------
我是一把手,处理所有的事情
----------------------
Disconnected from the target VM, address: '127.0.0.1:57004', transport: 'socket'