设计模式系列文章
设计模式(一):创建型之单例模式
设计模式(二、三):创建型之工厂方法和抽象工厂模式
设计模式(四):创建型之原型模式
设计模式(五):创建型之建造者模式
设计模式(六):结构型之代理模式
设计模式(七):结构型之适配器模式
设计模式(八):结构型之装饰器模式
设计模式(九):结构型之桥接模式
设计模式(十):结构型之外观模式
设计模式(十一):结构型之组合模式
设计模式(十二):结构型之享元模式
设计模式(十三):行为型之模板方法模式
设计模式(十四):行为型之策略模式
设计模式(十五):行为型之命令模式
设计模式(十六):行为型之责任链模式
5 种创建型模式
7 种结构型模式
11 种行为型模式
定义
请求发送者
与多个请求处理者
耦合在一起下一个对象的引用
而连成一条链职责链模式主要包含以下角色:
现需要开发一个请假流程控制系统
一天
以下的假只需要小组长
同意即可1天到3天
的假还需要部门经理
同意3天到7天
还需要总经理
同意才行@Getter
@AllArgsConstructor
public class LeaveRequest {
//姓名
private String name;
//请假天数
private int num;
//请假内容
private String content;
}
public abstract class Handler {
protected final static int NUM_ONE = 1;
protected final static int NUM_THREE = 3;
protected final static int NUM_SEVEN = 7;
// 该领导处理的请求天数区间
private int numStart;
private int numEnd;
// 声明后续者(声明上级领导)
private Handler nextHandler;
public Handler(int numStart) {
this.numStart = numStart;
}
public Handler(int numStart, int numEnd) {
this.numStart = numStart;
this.numEnd = numEnd;
}
// 设置上级领导对象
public void setNextHandler(Handler nextHandler) {
this.nextHandler = nextHandler;
}
// 各级领导处理请求条的方法
protected abstract void handleLeave(LeaveRequest leave);
// 提交请求条
public final void submit(LeaveRequest leave) {
// 该领导进行审批
this.handleLeave(leave);
// 如果还有上级 并且请假天数超过了当前领导的处理范围
if (this.nextHandler != null && leave.getNum() > this.numEnd) {
// 提交给上级领导进行审批
this.nextHandler.submit(leave);
} else {
System.out.println("流程结束!");
}
}
}
//小组长
public class GroupLeader extends Handler {
public GroupLeader() {
//小组长处理1-3天的请假
super(Handler.NUM_ONE, Handler.NUM_THREE);
}
@Override
protected void handleLeave(LeaveRequest leave) {
System.out.println(leave.getName() + "请假" + leave.getNum() + "天," + leave.getContent() + "。");
System.out.println("小组长审批:同意。");
}
}
//部门经理
public class Manager extends Handler {
public Manager() {
//部门经理处理3-7天的请假
super(Handler.NUM_THREE, Handler.NUM_SEVEN);
}
@Override
protected void handleLeave(LeaveRequest leave) {
System.out.println(leave.getName() + "请假" + leave.getNum() + "天," + leave.getContent() + "。");
System.out.println("部门经理审批:同意。");
}
}
//总经理
public class GeneralManager extends Handler {
public GeneralManager() {
//部门经理处理7天以上的请假
super(Handler.NUM_SEVEN);
}
@Override
protected void handleLeave(LeaveRequest leave) {
System.out.println(leave.getName() + "请假" + leave.getNum() + "天," + leave.getContent() + "。");
System.out.println("总经理审批:同意。");
}
}
public class Client {
public static void main(String[] args) {
//请假条来一张
LeaveRequest leave = new LeaveRequest("小花",5,"身体不适");
//各位领导
GroupLeader groupLeader = new GroupLeader();
Manager manager = new Manager();
GeneralManager generalManager = new GeneralManager();
groupLeader.setNextHandler(manager);//小组长的领导是部门经理
manager.setNextHandler(generalManager);//部门经理的领导是总经理
//提交申请
groupLeader.submit(leave);
}
}
优点
请求发送者
和接收者
的耦合度满足开闭原则
符合类的单一职责原则
缺点
以下是Filter的模拟实现分析:
public interface Request{
}
public interface Response{
}
public interface Filter {
public void doFilter(Request req,Response res,FilterChain c);
}
public class FirstFilter implements Filter {
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
System.out.println("过滤器1 前置处理");
// 先执行所有前置处理再倒序执行所有后置处理
chain.doFilter(request, response);
System.out.println("过滤器1 后置处理");
}
}
public class SecondFilter implements Filter {
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
System.out.println("过滤器2 前置处理");
// 先执行所有前置处理再倒序执行所有后置处理
chain.doFilter(request, response);
System.out.println("过滤器2 后置处理");
}
}
public class FilterChain {
private List<Filter> filters = new ArrayList<Filter>();
private int index = 0;
// 链式调用
public FilterChain addFilter(Filter filter) {
this.filters.add(filter);
return this;
}
public void doFilter(Request request, Response response) {
if (index == filters.size()) {
return;
}
Filter filter = filters.get(index);
index++;
filter.doFilter(request, response, this);
}
}
public class Client {
public static void main(String[] args) {
Request req = null;
Response res = null ;
FilterChain filterChain = new FilterChain();
filterChain.addFilter(new FirstFilter()).addFilter(new SecondFilter());
filterChain.doFilter(req,res);
}
}
输出结果:
过滤器1 前置处理
过滤器2 前置处理
过滤器2 后置处理
过滤器1 后置处理