职责链模式(案例:请假审批权限:小组长->经理->…)
在软件设计中,职责链模式(Chain of Responsibility Pattern)是一种行为设计模式,用于将请求的发送者和接收者解耦。在Java中实现职责链模式通常涉及创建多个处理对象(handler),这些对象构成一条链,每个处理对象都有机会处理请求或将其传递给链中的下一个对象。
职责链模式的核心组成部分:
- 处理器接口(Handler Interface):定义了处理请求的方法。所有的具体处理器都必须实现这个接口。
- 具体处理器(Concrete Handlers):实现处理器接口的类,每个类都处理它能处理的请求,并决定是否将请求传递到链上的下一个处理器。
- 客户端(Client):启动请求传递到职责链的起点
1. 创建处理器
public abstract class Leader {
private String name;
protected Leader supirior; //上级领导 即职责链
//抽象方法 请假天数
public abstract void handleRequest(int days);
public Leader(String name) {
this.name = name;
}
// 即职责链 name:本人 supirior:上级领导
public Leader(String name, Leader supirior) {
this.name = name;
this.supirior = supirior;
}
public void setName(String name) {
this.name = name;
}
public void setSupirior(Leader supirior) {
this.supirior = supirior;
}
public String getName() {
return name;
}
public Leader getSupirior() {
return supirior;
}
}
2. 定义具体处理器
//小组长处理
public class Grouper extends Leader{
public Grouper(String name) {
super(name);
}
//请假的具体实现
public void handleRequest(int days) {
if(days <= 1){
System.out.println( "小组长:"+this.getName()+"批准请假:"+days+"天!");
}else{
if (this.getSupirior()!=null){ //权限不够 则推给上级领导处理
this.getSupirior().handleRequest( days );
}else {
System.out.println("请假天数超过权限");
}
}
}
}
//经理处理
public class Manager extends Leader{
public Manager(String name) {
super(name);
}
//请假的具体实现
public void handleRequest(int days) {
if(days <= 3){
System.out.println( "经理:"+this.getName()+"批准请假:"+days+"天!");
}else{
if (this.getSupirior()!=null){ //权限不够 则推给上级领导处理
this.getSupirior().handleRequest( days );
}else {
System.out.println("请假天数超过权限!");
}
}
}
}
3. 客户端使用
//开闭原则 : 对修改关闭 对扩展开发
public class App {
public static void main(String[] args) {
//组装职责链
Leader grouper = new Grouper("小组长张三");
//小组长上加经理
Leader manager = new Manager("经理李四");
grouper.setSupirior(manager);
//经理上加总经理
/*
Leader generalManager = new GeneralManager("总经理lili");
manager.setSupirior(generalManager);
//总经理上加老板
Leader boss = new Boss("老板小明");
generalManager.setSupirior(boss);
*/
//请假3天
grouper.handleRequest(3);
}
}