您的位置:首页 > 其它

设计模式(24)-----责任链模式

2016-06-29 18:21 423 查看

责任链模式(chain of responsibility)

定义

  责任链模式是对象的行为模式。使多个对象都有机会处理请求,从而避免请求的发送者和接受者直接的耦合关系。将这些对象连成一条链,沿着这条链传递该请求,直到有一个对象处理它为止。

UML类图



角色

  抽象处理者(Handler)角色 :定义一个请求的接口。如果需要可以定义个一个方法用来设定和返回下家对象的引用。
  具体处理者(ConcreteHandler)角色 :如果可以处理就处理请求,如果不能处理,就把请求传给下家,让下家处理。也就是说它处理自己能处理的请求且可以访问它的下家。

例子

  有人想请假,小组长只能审批小于等于1天的假期,项目经理可以审批小于等于3天的假期,CEO可以审批所有的假期。

  Handler

package com.csdhsm.designpattem.chainofresponsibility;

/**
* @Title:  Handler.java
* @Description: 审批请假抽象类
* @author: Han
* @date:   2016年6月29日 下午6:05:46
*/
public abstract class Handler {

protected Handler handler;

public Handler getHandler() {
return handler;
}

public void setHandler(Handler handler) {
this.handler = handler;
}

//审批方法
public abstract void approve(int day);
}


  GroupLeader(小组长)

package com.csdhsm.designpattem.chainofresponsibility;

/**
* @Title:  GroupLeader.java
* @Description: 小组长,能审批的是小于等于1天的请假申请
* @author: Han
* @date:   2016年6月29日 下午5:58:29
*/
public class GroupLeader extends Handler {

@Override
public void approve(int day) {
if(day <= 1) {
System.out.println("小组长审批");
} else {
System.out.println("超过了小组长权限,移交上级");
this.getHandler().approve(day);
}
}
}


  ProjectManager(项目经理)

package com.csdhsm.designpattem.chainofresponsibility;

/**
* @Title:  ProjectManager.java
* @Description: 项目经理,能审批的是小于等于3天的请假
* @author: Han
* @date:   2016年6月29日 下午6:01:49
*/
public class ProjectManager extends Handler {

@Override
public void approve(int day) {
if(day <= 3) {
System.out.println("项目经理审批");
} else {
System.out.println("超过了项目经理权限,移交上级");
getHandler().approve(day);
}
}
}


  CEO

package com.csdhsm.designpattem.chainofresponsibility;

/**
* @Title:  CEO.java
* @Description: 最后移交到CEO审批
* @author: Han
* @date:   2016年6月29日 下午6:03:59
*/
public class CEO extends Handler {

@Override
public void approve(int day) {
System.out.println("CEO审批");
}
}


  客户端

package com.csdhsm.designpattem.chainofresponsibility;

public class Solution {
public static void main(String[] args) {
Handler leader = new GroupLeader();
Handler manager = new ProjectManager();
Handler ceo = new CEO();

//把Handler连成一条链
leader.setHandler(manager);
manager.setHandler(ceo);

//处理请求
leader.approve(6);
}
}


  结果



  OK,成功!

总结

  优点

    调用者不需知道具体谁来处理请求,也不知道链的具体结构,降低了节点域节点的耦合度;可在运行时动态修改链中的对象职责,增强了给对象指派职责的灵活性。

  缺点

    没有明确的接收者,可能传到链的最后,也没得到正确的处理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: