java 之 职责链模式(大话设计模式)
目前很多OA办公自动化软件,加快了办公效率,简化流程。相信很多小伙伴都用过。笔者了解到的大多数办公软件底层实现流程大多数采用的都是Activity或者是JBPM框架。
今天笔者要说的也是类似于流程的一个设计模式,职责模式。
先看下类图
大话设计模式-类图
看完类图,不知道大家有没有想到职责链模式似曾相识。笔者觉得此模式和状态模式很类似。不过笔者以为职责模式更为灵活些,可以在客户端就规定好流程。而状态模式则是在实现时流程已经定死。
简单看下笔者的Demo
/** * 请求 */ public class Request { private int breakDay; private String requestName; public Request(int breakDay, String requestName) { super(); this.breakDay = breakDay; this.requestName = requestName; } public int getBreakDay() { return breakDay; } public void setBreakDay(int breakDay) { this.breakDay = breakDay; } public String getRequestName() { return requestName; } public void setRequestName(String requestName) { this.requestName = requestName; } }
/** * 抽象父类 */ public abstract class Handler { private Handler handler; public Handler(Handler handler) { super(); this.handler = handler; } public abstract void handleRequest(Request request); public Handler getHandler() { return handler; } public void setHandler(Handler handler) { this.handler = handler; } }
/** * 经理 */ public class Manager extends Handler{ public Manager(Handler handler) { super(handler); } @Override public void handleRequest(Request request) { if (request.getBreakDay() < 10) { System.out.println("经理批准你去休息了"); } else { System.out.println("经理无权处理"); super.getHandler().handleRequest(request); } } }
/** * 总经理 */ public class AllManager extends Handler { public AllManager(Handler handler) { super(handler); } @Override public void handleRequest(Request request) { if (request.getBreakDay() < 20) { System.out.println("总经理批准你去休息"); } else { System.out.println("总经理无权处理"); super.getHandler().handleRequest(request); } } }
/** * 老板 */ public class Boss extends Handler { public Boss(Handler handler) { super(handler); } @Override public void handleRequest(Request request) { System.out.println("BOSS 批准你去休息。小心点吧!"); } }
/** * 客户端 */ public class Test { public static void main(String[] args) { Request request = new Request(40, "请假休息"); Handler boos = new Boss(null); Handler allManager = new AllManager(boos); Handler manager = new Manager(allManager); manager.handleRequest(request); } }
输出结果为
经理无权处理
总经理无权处理
BOSS 批准你去休息。小心点吧!
以上是笔者对职责链模式的理解,希望能帮助学习职责连的小伙伴理解此模式。