职责链模式(不重要):
对象行为型模式,将请求者与处理者解耦,请求沿着对象链传递,直到被符合条件的对象处理。无须关心请求的处理细节和传递过程,只需要将请求提交给职责链即可
职责链模式的角色:请求者,抽象处理者(一般为抽象类,定义一个自类型的对象,用与引用下一个处理者,将请求传递给下一个处理者,定义处理请求的方法),具体处理者(抽象处理者的子类,用于处理请求和转发请求)
职责链模式的适用场景:
1.有多个对象处理同一个请求,具体哪个对象处理这个请求,在运行时确定
2.在不确定处理者的情况下,向多个对象中的一个提交请求,请求沿着链进行传递,直到被处理
3.动态地指定一组对象处理请求,动态创建职责链,动态改变职责链的先后次序
职责链模式的优点:
1.将请求者与处理者解耦,降低系统的耦合度
2.增加新的处理类很方便,无须修改原有代码,符合开闭原则
3.在运行时,可动态地对职责链进行添加或修改来改变处理请求的处理类
职责链模式的缺点:
1.不能保证请求一定被处理(到职责链末端或职责链配置不正确)
2.如果职责链较长,会影响系统性能
职责链模式的例子(以请假天数为例)
请假请求类
public class LeaveRequest {
private String LeaveName;
private int leaveDays;
public LeaveRequest(String leaveName, int leaveDays) {
LeaveName = leaveName;
this.leaveDays = leaveDays;
}
public String getLeaveName() {
return LeaveName;
}
public void setLeaveName(String leaveName) {
LeaveName = leaveName;
}
public int getLeaveDays() {
return leaveDays;
}
public void setLeaveDays(int leaveDays) {
this.leaveDays = leaveDays;
}
}
抽象处理者
public abstract class Leader {
protected String name;
protected Leader leader;
public Leader(String name) {
this.name = name;
}
public void setLeader(Leader leader) {
this.leader = leader;
}
public abstract void handleRequest(LeaveRequest request);
}
处理者
public class Director extends Leader{
public Director(String name) {
super(name);
}
/**
* @Description: TODO
* @author doudou
* @date 2019年10月13日
* @param request
* @throws
* @return
* @see behavioral.ChainOfResPattern.Leader#handleRequest(behavioral.ChainOfResPattern.LeaveRequest)
*/
@Override
public void handleRequest(LeaveRequest request) {
if (request.getLeaveDays() < 3) {
System.out.println("主任"+this.name+"审批员工"+request.getLeaveName()+"的请假条,请假天数为"+request.getLeaveDays()+"天");
}else {
this.leader.handleRequest(request);
}
}
}
public class Manager extends Leader{
public Manager(String name) {
super(name);
}
/**
* @Description: TODO
* @author doudou
* @date 2019年10月13日
* @param request
* @throws
* @return
* @see behavioral.ChainOfResPattern.Leader#handleRequest(behavioral.ChainOfResPattern.LeaveRequest)
*/
@Override
public void handleRequest(LeaveRequest request) {
if (request.getLeaveDays()<10) {
System.out.println("经理"+this.name+"审批员工"+request.getLeaveName()+"的请假条,请假天数为"+request.getLeaveDays()+"天");
}else {
this.leader.handleRequest(request);
}
}
}
public class GeneralManager extends Leader{
public GeneralManager(String name) {
super(name);
}
/**
* @Description: TODO
* @author doudou
* @date 2019年10月13日
* @param request
* @throws
* @return
* @see behavioral.ChainOfResPattern.Leader#handleRequest(behavioral.ChainOfResPattern.LeaveRequest)
*/
@Override
public void handleRequest(LeaveRequest request) {
if (request.getLeaveDays() < 30) {
System.out.println("总经理"+this.name+"审批员工"+request.getLeaveName()+"的请假条,请假天数为"+request.getLeaveDays()+"天");
}else {
System.out.println("莫非"+request.getLeaveName()+"想辞职,居然请假"+request.getLeaveDays()+"天");
}
}
}
测试类
public class Main {
public static void main(String[] args) {
Leader director,manager,generalManager;
director = new Director("张三");
manager = new Manager("李四");
generalManager = new GeneralManager("王五");
//重要
director.setLeader(manager);
generalManager.setLeader(generalManager);
LeaveRequest leaveRequest = new LeaveRequest("doudou",6);
director.handleRequest(leaveRequest);
}
}
职责链模式的应用:
1.java中的异常处理try catch