更多设计模式文章请阅读:
1.定义
使多个对象都有机会处理请求,从而避免了请求的发送者与接受者之间的耦合关系,将这些对象生成一个链,并沿着这条链传递该对象,只到有对象处理这个请求为止,即:将一个请求从链式的首端发出,沿着链的路径依次传递给每一个节点对象,直至有对象处理这个请求为止,将这样的一种模式称为责任链设计模式
2.结构图
3.使用场景
多个对象可以处理同一个请求,但具体由哪个对象处理,只有到运行的时候动态决定
4.抽象简单实现示例:
/**
* 抽象处理着角色,声明请求处理方法,并在其中保留一个对下一个处理节点的对象的引用
*/
public abstract class Handler {
/**
* 下一个节点的处理者
*/
protected Handler successor;
/**
* 处理请求方法
* @param condition
*/
public abstract void handleRequest(String condition);
}
/**
* 第一个对象处理者
*/
public class Handler1 extends Handler {
@Override
public void handleRequest(String condition) {
if (condition.equals("handler1Request")){
System.out.println("Handler1 handler request");
return;
}else{
successor.handleRequest(condition);
}
}
}
/**
* 第二个对象处理者
*/
public class Handler2 extends Handler {
@Override
public void handleRequest(String condition) {
if (condition.equals("handler2Request")){
System.out.println("Handler2 handler request");
return;
}else{
successor.handleRequest(condition);
}
}
}
public class Main {
public static void main(String args[]){
//how to use
Handler1 handler1=new Handler1();
Handler2 handler2 =new Handler2();
handler1.successor=handler2;
handler2.successor=handler1;
handler1.handleRequest("handler2Request");
}
}
5.具体场景使用示例:
公司员工进行报销单子,假如组长的报销的金额是1000,经理报销的金额是3000,超过3000的则老板进行报销,模拟以上场景,实现责任链示例如下:
/**
* 抽象领导
*/
public abstract class Leader {
//上级领导
Leader nextHandler;
//报销金额
abstract int limit();
//具体处理请求方法
abstract void handler(int money);
//是否处理请求判断
void handerRequest(int money) {
if (money < limit()) {
handler(money);
} else {
if (nextHandler != null)
nextHandler.handerRequest(money);
}
}
}
/**
* 老板
*/
public class BossHandler extends Leader {
@Override
int limit() {
return Integer.MAX_VALUE;
}
@Override
void handler(int money) {
System.out.println("老板报销了:" + money);
}
}
/**
* 经理
*/
public class ManagerHandler extends Leader {
@Override
int limit() {
return 3000;
}
@Override
void handler(int money) {
System.out.println("项目经理报销了:" + money);
}
}
/**
* 组长
*/
public class GroupHandler extends Leader {
@Override
int limit() {
return 1000;
}
@Override
void handler(int money) {
System.out.println("组长报销了:" + money);
}
}
public class Me {
public static void main(String args[]) {
GroupHandler groupHandler = new GroupHandler();
ManagerHandler managerHandler = new ManagerHandler();
BossHandler bossHandler = new BossHandler();
groupHandler.nextHandler = managerHandler;
managerHandler.nextHandler = bossHandler;
groupHandler.handerRequest(500);
groupHandler.handerRequest(1900);
groupHandler.handerRequest(8000);
}
}