java设计模式--职责链模式

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

我们看以下例子

首先是一个请求类,这个请求有一个属性number,代表请假天数,请求将会被管理者处理。

//请求类
public class Request {

    //请假天数
    private int number;

    public int getNumber() {
        return number;
    }

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

 

//管理者类,用来批准请求
public class Mananger {

    //职位
    private String position;

    public Mananger(String position){
        this.position = position;
    }

    public void deal(Request request){
        if(position.equals("项目经理")){
            if(request.getNumber()<=2){
                System.out.println(position+"同意请假"+request.getNumber()+"天");
            }else {
                System.out.println(position+"无权处理请假"+request.getNumber()+"天");
            }
        }else if(position.equals("总监")){
            if(request.getNumber()<=4){
                System.out.println(position+"同意请假"+request.getNumber()+"天");
            }else {
                System.out.println(position+"无权处理请假"+request.getNumber()+"天");
            }
        }else if(position.equals("总经理")){
            if(request.getNumber()<=10){
                System.out.println(position+"同意请假"+request.getNumber()+"天");
            }else {
                System.out.println(position+"无权处理请假"+request.getNumber()+"天");
            }
        }
    }
}

测试类:

public class Test {
    public static void main(String[] args) {
        Request request = new Request();
        request.setNumber(7);
        Mananger mananger1 = new Mananger("项目经理");
        Mananger mananger2 = new Mananger("总监");
        Mananger mananger3 = new Mananger("总经理");
        mananger1.deal(request);
        mananger2.deal(request);
        mananger3.deal(request);
    }
}

测试结果:

项目经理无权处理请假7天
总监无权处理请假7天
总经理同意请假7天

上面这个例子只是完成了一个请求交付给不同的管理者处理的结果,但是这样设计的并不好,管理者里有很多的分值判断,所有管理者都用这一个类去判断,违背了单一职责原则,并且如果以后我们需要增加管理者类别还需要去修改这个类违背了开放-封闭原则。

所以有了下面的职责链模式的例子:

//请求类
public class Request {

    //请假天数
    private int number;

    public int getNumber() {
        return number;
    }

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

管理者抽象类

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 Request(Request request);
}

具体管理者

public class ConcreteManager1 extends Manager {

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

    @Override
    public void Request(Request request) {
            if(request.getNumber()<=2){
                System.out.println(name + "同意请假"+request.getNumber()+"天");
            }else {
                if(superior!=null){
                    superior.Request(request);
                }
            }
    }
}
public class ConcreteManager2 extends Manager {

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

    @Override
    public void Request(Request request) {
        if(request.getNumber()<=4){
            System.out.println(name + "同意请假"+request.getNumber()+"天");
        }else {
            if(superior!=null){
                superior.Request(request);
            }
        }
    }
}
public class ConcreteManager3 extends Manager {

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

    @Override
    public void Request(Request request) {
        if(request.getNumber()<=10){
            System.out.println(name + "同意请假"+request.getNumber()+"天");
        }else {
            if(superior!=null){
                superior.Request(request);
            }
        }
    }
}

测试类:

public class Test {
    public static void main(String[] args) {
        Manager manager1 = new ConcreteManager1("经理");
        Manager manager2 = new ConcreteManager2("总监");
        Manager manager3 = new ConcreteManager3("总经理");

        manager1.setSuperior(manager2);
        manager2.setSuperior(manager3);

        Request request = new Request();
        request.setNumber(7);

        manager1.Request(request);

    }
}

 

测试结果:总经理同意请假7天

从上面的例子我们可以看到我们把条件判断放到了每一个具体的管理者类中,每一个管理者当自己处理不了请求时,就去调用另一个管理者的方法,以后如果添加新的管理者也变得方便了,实现了解耦。

posted @ 2019-08-04 16:17  亦梦亦真  阅读(176)  评论(0编辑  收藏  举报