优点:
- 降低耦合,将请求发送和接收解耦
- 简化了对象
- 增强给对象指派职责灵活性
- 增加新的请求处理方便
缺点:
- 不能保证请求一定被接收
- 性能受到影响,循环调用
Handler处理者
package commemory.chain;
/**
* 责任链 ,定义职责对象的接口
*
* @author Administrator
*
*/
public abstract class Handler {
/**
* 下一个处理请求的对象
*/
private Handler mHandler;
/**
*
* 持有级别
*/
protected Level mLevel;
public final void handleMessage(Request request) {
System.out.println("当前所属级别" + this.mLevel);
if (request.getLevel() == this.mLevel) {
holiday();
} else if (this.mHandler != null) {
this.mHandler.handleMessage(request);
} else {
failure();
}
}
/**
* 设置下一个责任人
*
* @param handler
*/
public Handler setHandler(Handler handler) {
this.mHandler = handler;
return mHandler;
}
/**
* 设置下一个请求
*
* @param level
*/
public void setLevel(Level level) {
this.mLevel = level;
}
protected abstract void config();
/**
* 批假天数,具体任务
*
* @return
*/
public abstract String holiday();
private void failure() {
System.out.println("请假时间太长,不批哈哈!");
}
}
package commemory.chain;
/**
* 级别
*
* @author Administrator
*
*/
public enum Level {
NONE, // 没有权限
GOUPLD, // 组长
MANAGER, // 经
BOSS // boss
}
具体处理者
package commemory.chain;
/**
* 老大
*
* @author Administrator
*
*/
public class BossHandler extends Handler {
public BossHandler() {
// TODO Auto-generated constructor stub
config();
}
/**
* 初始化配置
*/
protected void config() {
setLevel(Level.BOSS);
}
@Override
public String holiday() {
// TODO Auto-generated method stub
System.out.println("大boos批假");
return "批假5~10天";
}
}
package commemory.chain;
/**
* 组长
*
* @author Administrator
*
*/
public class GroupLdHandler extends Handler {
public GroupLdHandler() {
// TODO Auto-generated constructor stub
config();
}
@Override
protected void config() {
// TODO Auto-generated method stub
setLevel(Level.GOUPLD);
}
@Override
public String holiday() {
// TODO Auto-generated method stub
System.out.println("组长批假");
return "批假1~2天";
}
}
package commemory.chain;
/**
* 组长
*
* @author Administrator
*
*/
public class ManagerHandler extends Handler {
public ManagerHandler() {
// TODO Auto-generated constructor stub
config();
}
@Override
protected void config() {
// TODO Auto-generated method stub
setLevel(Level.MANAGER);
}
@Override
public String holiday() {
// TODO Auto-generated method stub
System.out.println("经理批假");
return "批假3~5天";
}
}
请求者
package commemory.chain;
/**
* 请求
*
* @author Administrator
*
*/
public class Request {
Level mLevel;
public void config(int day) {
Level object = Level.NONE;
if (day > 6) {
object = Level.BOSS;
} else if (day > 2) {
object = Level.MANAGER;
} else if (day > 0) {
object = Level.MANAGER;
}
// 最多批10天假
if (day > 10) {
object = Level.NONE;
}
mLevel = object;
}
public Level getLevel() {
return mLevel;
}
}
测试
// 责任链模式 ?
GroupLdHandler gp = new GroupLdHandler();
ManagerHandler mg = new ManagerHandler();
BossHandler boss = new BossHandler();
gp.setHandler(mg).setHandler(boss);
Request request = new Request();
request.config(13);
gp.handleMessage(request);
//输出结果
启动应用成功!开启美好的一天
当前所属级别GOUPLD
当前所属级别MANAGER
当前所属级别BOSS
请假时间太长,不批哈哈!