【设计模式】责任链模式

1.定义

责任链模式(Chain of Responsibility)也称为职责链模式,它使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。即构造一系列分别担当不同的职责的类的对象来共同完成一个任务。

2.结构

2.1 UML类图

责任链模式

2.2 角色
  • Handler 处理类的抽象父类,定义了一个处理请求的方法。所有的处理者都必须实现该抽象类。
  • Concrete Handler 具体的处理类,处理它所负责的请求,同时也可以访问它的后继者。

3.实现

class Request {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

abstract class Handler {
    protected Handler handler;

    protected void setHandler(Handler handler) {
        this.handler = handler;
    }

    protected abstract void handleRequest(Request request);
}

class Manager extends Handler {
    @Override
    protected void handleRequest(Request request) {
        System.out.println(request.getName() + " 经理审批中...");
        if (this.handler != null) {
            this.handler.handleRequest(request);
        }
    }
}

class Director extends Handler {
    @Override
    protected void handleRequest(Request request) {
        System.out.println(request.getName() + " 主管审批中...");
        if (this.handler != null) {
            this.handler.handleRequest(request);
        }
    }
}


class President extends Handler {
    @Override
    protected void handleRequest(Request request) {
        System.out.println(request.getName() + " 总监审批中...");
        if (this.handler != null) {
            this.handler.handleRequest(request);
        }
    }
}

public class ChainOfResponsibilityDemo {
    public static void main(String[] args) {
        Manager manager = new Manager();
        Director director = new Director();
        President president = new President();
        manager.setHandler(director);
        director.setHandler(president);

        Request request = new Request();
        request.setName("员工小王请假");
        manager.handleRequest(request);
    }
}

4.总结

4.1 优点
  • 降低耦合度:每个类只需要处理自己该处理的工作(不该处理的传递给下一个对象完成),明确各类的责任范围,符合类的最小封装原则。可根据需要自由组合工作流程。类与类之间可以以松耦合的形式加以组织。
  • 便于增加新的请求处理类,而不需要修改代码,符合开闭原则。
4.2 缺点
  • 处理时以链的形式在对象之间传递消息,根据实现方式不同,有可能影响处理的速度。
  • 可能会造成循环调用。
4.3 应用场景
  • 有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。
  • 在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。

本人才疏学浅,若有错,请指出,谢谢!
如果你有更好的建议,可以留言我们一起讨论,共同进步!
衷心的感谢您能耐心的读完本篇博文!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值