设计模式-责任链模式
参考:https://blog.csdn.net/weixin_49561506/article/details/129789351
概念
责任链模式(Chin of Responsibility)是一种行为型设计模式,它通过将请求的发送者和接收者解耦来实现请求的处理。
责任链模式(Chin of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链子,并沿着这条链传递该请求,直到有一对象处理到它为止。
应用场景
- 处理请求需要多个对象协作,且不确定哪个对象能够处理请求。
- 需要动态指定能够处理请求的对象集合。
- 需要在不明确接收者的情况下,向多个对象中的一个或多个发送请求。
- 可以通过在运行时添加或删除处理器来改变请求处理的顺序。
- 当一个请求需要被多个对象进行处理时,可以使用责任链模式避免产生复杂的嵌套调用。
- 可以将责任链模式与其他设计模式结合使用,如装饰器模式、工厂模式等,以实现更加灵活的功能。
优缺点
优点
- 降低系统的耦合度:请求发送者和接收者之间不直接交互,而是通过责任链上的多个对象进行交互,从而降低了它们之间的耦合度。
- 增强系统的灵活性:可以动态地增加或删除处理器,从而改变请求的处理顺序和方式。
- 提高代码的可扩展性:因为每个处理器都只负责处理自己能够处理的请求,所以可以方便地添加新的处理器来处理新的请求类型。
- 提高代码的可维护性:因为每个处理器都只负责处理自己能够处理的请求,所以可以方便地添加新的处理器来处理新的请求类型。
缺点
- 请求可能没有被处理:如果没有任何一个处理器能够处理该请求,则该请求将被忽略。
- 系统性能可能受影响:由于责任链中可能包含大量的处理器,因此可能会影响系统的性能。
事例
利用责任链模式编制员工请假审批功能类
- 请求类
public class Request {
int day; //请假的天数
Request(int day) {
this.day = day;
}
}
- 抽象处理者类Handler
public abstract class Handler {
private Handler next;
public Handler getNext() {
return next;
}
public void setNext(Handler next) {
this.next = next;
}
//定义抽象请求方法,子类要重写
public abstract boolean handle(Request request);
}
- 三个具体处理者类
public class ZuZhang extends Handler{
static int limit = 1;
@Override
public boolean handle(Request request) {
if (request.day <= limit) {
System.out.println("组长同意请假!");
return true;
}
return getNext().handle(request);
}
}
public class ZhuRen extends Handler{
static int limit = 2;
@Override
public boolean handle(Request request) {
if (request.day <= limit) {
System.out.println("主任同意请假!");
return true;
}
return getNext().handle(request);
}
}
public class JingLi extends Handler{
static int limit = 3;
@Override
public boolean handle(Request request) {
if (request.day <= limit) {
System.out.println("经理同意请假!");
return true;
}
return getNext().handle(request);
}
}
- 生成责任链前后顺序关系类
public class MyChain {
private Handler one = new ZuZhang();
private Handler two = new ZhuRen();
private Handler three = new JingLi();
//生成责任链
public void createChain() {
one.setNext(two);
two.setNext(three);
}
public void handle(Request request) {
one.handle(request);
}
}
- 测试类
public class Test {
public static void main(String[] args) {
Request request = new Request(3);
MyChain myChain = new MyChain();
myChain.createChain();
myChain.handle(request);
}
}
- 测试结果
经理同意请假!