责任链模式

1类图

这里写图片描述

2定义:

很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。

3应用场景:

3.1 多个对象可以处理同一个请求,但具体由那个对象则在运行时动态决定。

3.2 在请求处理者的情况下向多个对象中的一个提交一个请求。

3.3 需要动态指定一组对象处理请求。

通用模板:

4抽象处理者

public abstract class Handler {
    protected Handler successor;
    public abstract void handleRequest(String condition);
}

5具体处理者1

public class ConcreteHandler1 extends Handler {

    @Override
    public void handleRequest(String condition) {
        // TODO Auto-generated method stub
        if(condition.equals("ConcreteHandler1")){
            System.out.println("ConcreteHandler1 handled");
            return;
        }else{
            successor.handleRequest(condition);
        }
    }

}

6具体处理者2

public class ConcreteHandler2 extends Handler {

    @Override
    public void handleRequest(String condition) {
        // TODO Auto-generated method stub
        if(condition.equals("ConcreteHandler2")){
            System.out.println("ConcreteHandler2 handled");
            return;
        }else{
            successor.handleRequest(condition);
        }
    }

}

7测试

public class Client {
    public static void main(String[] args) {
        ConcreteHandler1 handler1 = new ConcreteHandler1();
        ConcreteHandler2 handler2 = new ConcreteHandler2();

        handler1.successor = handler2;
        handler2.successor = handler1;

        handler1.handleRequest("ConcreteHandler2");
    }
}

简单实现:

8抽象领导类

public abstract class Leader {
    protected Leader nextHandler;

    public final void handleRequest(int money){
        if(money <= limit()){
            handle(money);
        }else{
            if(null != nextHandler)
                nextHandler.handleRequest(money);
        }
    }

    public abstract int limit();
    public abstract void handle(int money);
}

9组长类

public class GroupLeader extends Leader {

    @Override
    public int limit() {
        return 1000;
    }

    @Override
    public void handle(int money) {
        System.out.println("组长批覆报销: " + money + "元");
    }

}

10主管类

public class Director extends Leader {

    @Override
    public int limit() {
        // TODO Auto-generated method stub
        return 5000;
    }

    @Override
    public void handle(int money) {
        // TODO Auto-generated method stub
        System.out.println("主管批覆报销: " + money + "元");
    }

}

11经理类

public class Manager extends Leader {

    @Override
    public int limit() {
        // TODO Auto-generated method stub
        return 10000;
    }

    @Override
    public void handle(int money) {
        // TODO Auto-generated method stub
        System.out.println("经理批覆报销: " + money + "元");
    }

}

12老板类

public class Boss extends Leader {

    @Override
    public int limit() {
        // TODO Auto-generated method stub
        return Integer.MAX_VALUE;
    }

    @Override
    public void handle(int money) {
        // TODO Auto-generated method stub
        System.out.println("老板批覆报销: " + money + "元");
    }

}

13测试类

public class Test {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        GroupLeader groupLeader = new GroupLeader();
        Director director = new Director();
        Manager manager = new Manager();
        Boss boss = new Boss();

        groupLeader.nextHandler = director;
        director.nextHandler = manager;
        manager.nextHandler = boss;

        groupLeader.handleRequest(9000);
    }
}
发布了51 篇原创文章 · 获赞 12 · 访问量 1万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章