今天总结谈一谈java设计模式中的责任链模式。
应用场景:
servlet中的filter
dubbo中的filter
mybatis中的plugin
这3个框架在实现责任链方式不尽相同
UML图
实现的简单demo,这里用公司请假来实例。
Jet请假,首先由主任审批,不在主任审批范围内就交给上级一直到符合为止。
请假类:
public class LeaveRequest {
private String name;
private int leaveDays;
private String leavenReson;
public LeaveRequest() {
}
public LeaveRequest(String name,int leaveDays,String leavenReson){
this.name = name;
this.leaveDays = leaveDays;
this.leavenReson = leavenReson;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getLeaveDays() {
return leaveDays;
}
public void setLeaveDays(int leaveDays) {
this.leaveDays = leaveDays;
}
public String getLeavenReson() {
return leavenReson;
}
public void setLeavenReson(String leavenReson) {
this.leavenReson = leavenReson;
}
}
然后创建抽象类领导类:
public abstract class Leader {
protected String name;
protected Leader nextLeader;
public Leader() {
}
public Leader(String name) {
this.name = name;
}
public void setNextLeader(Leader nextLeader) {
this.nextLeader = nextLeader;
}
public abstract void handleRequest(LeaveRequest leader);
}
然后分别继承领导类创建,主任,经理,总经理类
主任:
//主任
public class Director extends Leader{
public Director(String name){
super(name);
}
/**
* 责任链上对象请求的具体处理
* @param leader
*/
@Override
public void handleRequest(LeaveRequest leader) {
if(leader.getLeaveDays() <= 3){
System.out.println("请假人:" + leader.getName() + ",天数" + leader.getLeaveDays() + ",理由" + leader.getLeavenReson());
System.out.println("审批人:" + this.name + "主任,审批通过");
}else{
if(this.nextLeader != null){ //如果有下一个继承者
//让下一个继承者处理请求
this.nextLeader.handleRequest(leader);
}
}
}
}
经理类:
public class Manager extends Leader{
public Manager(String name){
super(name);
}
/**
* 责任链上对象请求的具体处理
* @param leader
*/
@Override
public void handleRequest(LeaveRequest leader) {
if(leader.getLeaveDays() <= 10){
System.out.println("请假人:" + leader.getName() + ",天数" + leader.getLeaveDays() + ",理由" + leader.getLeavenReson());
System.out.println("审批人:" + this.name + "经理,审批通过");
}else{
if(this.nextLeader != null){ //如果有下一个继承者
//让下一个继承者处理请求
this.nextLeader.handleRequest(leader);
}
}
}
}
总经理类:
//总经理
public class GeneralManager extends Leader{
public GeneralManager(String name) {
super(name);
}
/**
* 责任链上对象对请求的具体处理
*/
@Override
public void handleRequest(LeaveRequest leader) {
if (leader.getLeaveDays()<=30) {
System.out.println("请假人:"+leader.getName()+",天数:"+leader.getLeaveDays()+",理由:"+leader.getLeavenReson());
System.out.println("审批人:"+this.name+" 总经理,审批通过!");
}else{
System.out.println("请假申请,最终不通过!最终审批人:"+this.name+" 总经理");
}
}
}
主类的调用:
public class Main {
public static void main(String[] args) {
Leader director = new Director("李东");
Leader manager = new Manager("张雷");
Leader generalManager = new Manager("赵发");
director.setNextLeader(manager);
manager.setNextLeader(generalManager);
LeaveRequest request = new LeaveRequest("Jet",6,"出差");
director.handleRequest(request);
}
}
运行结果:
请假人:Jet,天数6,理由出差
审批人:张雷经理,审批通过
如果要增加领导或减少领导直接新建类然后在Main中修改链之间的关系就行了,这样降低了类与类之间的耦合。