定义:
让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
例子
让我们通过一个请假回家生孩子的例子来实现一个简单的责任链模式吧。
这里我们需要部门主管,人事部,和总经理来审批请假条。
1、创建假条
创建一个请假条的接口:ILeave
interface ILeave {
//请假内容
abstract String getContent();
}
真实的请假条:RealLeave
class RealLeave implements ILeave {
private String mContent;
public RealLeave(String content){
this.mContent = content;
}
@Override
public String getContent() {
return mContent;
}
}
2、创建审批者
创建一个抽象的负责审批分发请假条的Handler
类
abstract class Handler {
//审批权限等级
protected int level;
Handler mNextHandler;
//下一个审批者
public void setNextHandler(Handler nextHandler) {
this.mNextHandler = nextHandler;
}
public void handlerMessage(ILeave iLeave){
//审批权限是否足够
if (this.level >= level){
//如果同意,并且还有下个审批者,则传递假条继续审批
if (this.response(iLeave) && mNextHandler != null){
mNextHandler.handlerMessage(iLeave);
}
}else {
//如果权限不够,还有下一个审批者,则传递假条继续审批
if (mNextHandler != null){
mNextHandler.handlerMessage(iLeave);
}
}
}
//返回审批结果,同意,不同意
abstract boolean response(ILeave leave);
}
创建实际的审批对象。
1、主管
class Charge extends Handler{
public Charge(){
//声明审批权限等级
level = 1;
}
@Override
boolean response(ILeave leave) {
System.out.println("主管收到请假请求:" + leave.getContent() + " --- 同意");
//设置下一个审批者
setNextHandler(new Personnel());
return true;
}
}
2、人事部
class Personnel extends Handler {
public Personnel(){
//声明审批权限等级
level = 2;
}
@Override
boolean response(ILeave leave) {
System.out.println("人事部收到请假请求:" + leave.getContent() + " --- 同意");
//设置下一个审批者
setNextHandler(new Manager());
return true;
}
}
3、总经理
class Manager extends Handler {
public Manager(){
//声明权限等级
level = 3;
}
@Override
boolean response(ILeave leave) {
System.out.println("总经理收到请假请求:" + leave.getContent() + " --- 同意");
return true;
}
}
执行请假流程
到这里我们的请假条和审批者都已经创建完毕,可以去请假了。
public static void main(String[] args){
ILeave leave = new RealLeave("回家生孩子");
Handler handler = new Charge();
handler.handlerMessage(leave);
}
这里我们创建了一个请假条,然后从部门主管开始审批。
执行结果如下:
主管收到请假请求:回家生孩子 --- 同意
人事部收到请假请求:回家生孩子 --- 同意
总经理收到请假请求:回家生孩子 --- 同意
当然如果你是技术总监可以直接找总经理审批:
public static void main(String[] args){
ILeave leave = new RealLeave("回家生孩子");
Handler handler = new Manager();
handler.handlerMessage(leave);
}
执行结果如下:
总经理收到请假请求:回家生孩子 --- 同意
当然我们还可以手动设置下一个审批者
Handler charge = new Charge();
Handler manager = new Manager();
Handler personnel = new Personnel();
charge.setNextHandler(manager);
manager.setNextHandler(personnel);
不过要将Charge,Manager,Personnel中response()
方法中的setNextHandler注释掉。
例子总结:
从上面的流程图可以看到,主管,人事,总经理组成了一个审批的链,并且请假请求沿着链向下传递。
优缺点
优点:
- 降低耦合度。它将请求的发送者和接收者解耦。
- 简化了对象。使得对象不需要知道链的结构。
- 增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任
- 增加新的请求处理类很方便。
缺点: - 不能保证请求一定被接收
参考:设计模式之禅