设计模式-职责链模式
概念
责任链模式是一种设计模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。
优点
1、降低耦合度。它将请求的发送者和接收者解耦。
2、简化了对象。使得对象不需要知道链的结构。
3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
4、增加新的请求处理类很方便。
缺点
1、不能保证请求一定被接收。
2、系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。
3、可能不容易观察运行时的特征,有碍于除错。
角色
1、抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。上图中Handler类的聚合关系给出了具体子类对下家的引用,抽象方法handleRequest()规范了子类处理请求的操作。
2、具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。
2、具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。
使用场景
1、有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。
2、在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
3、可动态指定一组对象处理请求。
案例描述
职责链的案例最多的就是公司请假之类的流程审批,这里也采用这个场景做演示
UML类图
代码解析UML类图
/** * 设计模式-职责连模式-Handler * * Created by lzy on 2017/6/14. */ public abstract class AbstractManagerHandle { public AbstractManagerHandle(String name) { this.name = name; } /** * 处理者名字 */ private String name; /** * 后继者 */ private AbstractManagerHandle superManager; /** * 设置后继者 * @param superManager */ public void setSuperManager(AbstractManagerHandle superManager){ this.superManager = superManager; } /** * 处理请求 * @param request */ public abstract void handleRequest(Request request); public AbstractManagerHandle getSuperManager() { return superManager; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
/** * 设计模式-职责连模式-具体Handler * * 主管 * * Created by lzy on 2017/6/14. */ public class DirectorHandle extends AbstractManagerHandle { public DirectorHandle(String name) { super(name); } @Override public void handleRequest(Request request) { if (request == null){ return; } if ("请假".equals(request.getRequestType()) && request.getNum() < 6){ System.out.println(this.getName() + "通过"); }else { if (this.getSuperManager() != null){ this.getSuperManager().handleRequest(request); } } } }
/** * 设计模式-职责连模式-具体Handler * * * 组长 * * Created by Dell on 2017/6/14. */ public class LeaderHandle extends AbstractManagerHandle { public LeaderHandle(String name) { super(name); } @Override public void handleRequest(Request request) { if (request == null){ return; } if ("请假".equals(request.getRequestType()) && request.getNum() < 4){ System.out.println(this.getName() + "通过"); }else { if (this.getSuperManager() != null){ this.getSuperManager().handleRequest(request); } } } }
/** * 设计模式-职责连模式-具体Handler * * 经理 * * Created by lzy on 2017/6/14. */ public class ManagerHandle extends AbstractManagerHandle { public ManagerHandle(String name) { super(name); } @Override public void handleRequest(Request request) { if (request == null){ return; } if ("请假".equals(request.getRequestType()) && request.getNum() > 5){ System.out.println(this.getName() + "通过"); } } }
/** * Created by lzy on 2017/6/14. */ public class Request { /** * 请求类型 */ private String requestType; /** * 数量 */ private int num; public int getNum() { return num; } public void setNum(int num) { this.num = num; } public String getRequestType() { return requestType; } public void setRequestType(String requestType) { this.requestType = requestType; } }
测试
/** * Created by lzy on 2017/6/14. */ public class Client { public static void main(String[] args) { AbstractManagerHandle zhuguan = new DirectorHandle("李主管"); AbstractManagerHandle zuzhang = new LeaderHandle("陈组长"); AbstractManagerHandle jinli = new ManagerHandle("张经理"); zuzhang.setSuperManager(zhuguan); zhuguan.setSuperManager(jinli); Request request = new Request(); request.setNum(2); request.setRequestType("请假"); Request request2 = new Request(); request2.setNum(5); request2.setRequestType("请假"); Request request3 = new Request(); request3.setNum(10); request3.setRequestType("请假"); zuzhang.handleRequest(request); zuzhang.handleRequest(request2); zuzhang.handleRequest(request3); } }