Java 23种设计模式之责任链模式

1. 概念

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

2. 创建Handler抽象类对象

/**
 * @author zlc
 * @created 2017/12/24
 * 管理者类 处理请求
 */
public abstract class Manager {

    protected String name;
    //管理者上级
    protected Manager superior;

    public Manager(String name){
        this.name = name;
    }

    public void setSuperior(Manager superior) {
        this.superior = superior;
    }

    public abstract  void doRequest(Request request);
}

3. 创建具体的Handler对象 继承抽象类对象

1.普通经理类
/**
 * @author zlc
 * @created 2017/12/24
 * 经理
 */
public class CommonManager extends Manager{

    public CommonManager(String name) {
        super(name);
    }

    @Override
    public void doRequest(Request request) {
        if(request.getRequestType().equals("请假") && request.getNumber() <= 3){
            System.out.println(name+" : "+request.getRequestContent()+ "数量 "+ request.getNumber()+" 天,批准了");
        }else if(superior != null){
            superior.doRequest(request);
        }
    }
}

2.总监类

/**
 * @author zlc
 * @created 2017/12/24
 * 总监
 */
public class Majordomo extends Manager{

    public Majordomo(String name) {
        super(name);
    }

    @Override
    public void doRequest(Request request) {
        if(request.getRequestType().equals("请假") && request.getNumber() <= 7){
            System.out.println(name+" : "+request.getRequestContent()+ "数量 "+ request.getNumber()+" 天,批准了");
        }else if(superior != null){
            superior.doRequest(request);
        }
    }
}

3. 总经理类

/**
 * @author zlc
 * @created 2017/12/24
 * 总经理
 */
public class GeneralManager extends Manager{

    public GeneralManager(String name) {
        super(name);
    }

    @Override
    public void doRequest(Request request) {

        if(request.getRequestType().equals("请假")){

            System.out.println(name+" : "+request.getRequestContent()+ "数量 "+ request.getNumber()+" 天,批准了");

        }else if(request.getRequestType().equals("加薪") ) {

            if (request.getNumber() <= 500) {
                System.out.println(name + " : " + request.getRequestContent() + "数量 " + request.getNumber() + ",批准了");
            } else {
                System.out.println(name + " : " + request.getRequestContent() + "数量 " + request.getNumber() + ",再说吧");
            }

        }
    }
}

4.创建一个请求类

/**
 * @author zlc
 * @created 2017/12/24
 */
public class Request {

    private String requestType;
    private String requestContent;
    private int number;

    public void setNumber(int number) {
        this.number = number;
    }

    public int getNumber() {
        return number;
    }

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

    public String getRequestType() {
        return requestType;
    }

    public void setRequestContent(String requestContent) {
        this.requestContent = requestContent;
    }

    public String getRequestContent() {
        return requestContent;
    }
}

5. 测试类

@org.junit.Test
public void test(){

    Manager cc = new CommonManager("cc");

    Manager yjy = new Majordomo("yjy");

    Manager zlc = new GeneralManager("zlc");

    cc.setSuperior(yjy);
    yjy.setSuperior(zlc);

    Request request1 = new Request();
    request1.setRequestType("请假");
    request1.setRequestContent("小菜请假");
    request1.setNumber(3);
    cc.doRequest(request1);

    Request request2 = new Request();
    request2.setRequestType("请假");
    request2.setRequestContent("小菜请假");
    request2.setNumber(5);
    cc.doRequest(request2);

    Request request3 = new Request();
    request3.setRequestType("加薪");
    request3.setRequestContent("小菜请求加薪");
    request3.setNumber(1000);
    cc.doRequest(request3);

}

6.小结

当客户提交一个请求时,请求时沿链传递直至有一个具体对象负责处理它,
责任链可以简化对象的互相连接,它们仅仅需要保持一个指向后继者的引用,
而不需要保持它所有的候选接受者的引用。 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值