Java设计模式之职责链模式

职责链模式

使多个对象都有机会处理请求,从而避免请求的发起者和接受者之间的耦合关系,将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
在这里插入图片描述

在这里插入图片描述

比如在公司请假,经理处理不了的,上报给总监,总监处理不了的上报给总经理。
管理者抽象类:

public abstract class Manager {
    //名字
    protected String name;
    //上级
    protected Manager superManager;
    public Manager(String name){
        this.name = name;
    }
    //设置上级
    public void setSuperManager(Manager manager){
        this.superManager = manager;
    }
    //处理请求
    public abstract void handle(Request request);
}

经理:

public class JuniorManager extends Manager{
    public JuniorManager(String name){
        super(name);
    }
    @Override
    public void handle(Request request) {
     if(request.getRequestType().equals("请假")&&request.getRequestNum()<3){
         System.out.println("初级管理者:"+name+"批准...");
     }else{
         superManager.handle(request);
     }
    }
}

总监:

public class MiddleManager extends Manager {
    public MiddleManager(String name){
        super(name);
    }
    @Override
    public void handle(Request request) {
        if(request.getRequestType().equals("请假")&&request.getRequestNum()<10){
            System.out.println("中级管理者:"+name+"批准...");
        }else{
            superManager.handle(request);
        }
    }
}

总经理:

public class SeniorManager extends Manager {
    public SeniorManager(String name){
        super(name);
    }
    @Override
    public void handle(Request request) {
        if(request.getRequestType().equals("加薪")&&request.getRequestNum()<5000){
            System.out.println("高级管理者:"+name+"批准...");
        }else{
            System.out.println("高级管理者:"+name+"不批准...");
        }
    }
}

请求类:

public class Request {
    //名字
    private String name;
    //请求的类型
    private String requestType;
    //请求的天数
    private Integer requestNum;

    public Request(String name, String requestType, Integer requestNum) {
        this.name = name;
        this.requestType = requestType;
        this.requestNum = requestNum;
    }

    public String getName() {
        return name;
    }

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

    public String getRequestType() {
        return requestType;
    }

    public void setRequestType(String requestType) {
        this.requestType = requestType;
    }

    public Integer getRequestNum() {
        return requestNum;
    }

    public void setRequestNum(Integer requestNum) {
        this.requestNum = requestNum;
    }
}

雇员:

public class Employee {
    public static void main(String[] args) {
        //公司成员
        //初级管理者
        Manager manager = new JuniorManager("小红");
        Manager manager1 = new MiddleManager("小明");
        Manager manager2 = new SeniorManager("小王");
        //等级关系
        manager.setSuperManager(manager1);
        manager1.setSuperManager(manager2);
        //发出请求
        Request request = new Request("小张", "请假",5 );
        manager.handle(request);
        //发出请求
        Request request1 = new Request("小张", "加薪",6000 );
        manager.handle(request1);
    }
}
中级管理者:小明批准...
高级管理者:小王不批准...

职责链的好处

当客户提交一个请求时,请求是沿着链传递直到有一个具体的接收者对象负责处理它。这使得接收者和发送者都没有对方的明确信息,而且链中的对象自己也不知道链的结构,结果是职责链可简化对象的相互连接,他们仅需要保持一个指向其后继者的引用,而不需要保持它所有的候选接收者的引用。这也就大大降低了指派职责的灵活性
虽然很灵活,但也要注意一个请求极有可能到了链的末端都没有得到处理,或者因为没有正确配置而得不到处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值