设计模式之职责链模式

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

可以定义一个抽象类来表示处理事件的对象,这个类首先有个处理事件的抽象方法,然后提供一个方法设置下一级处理者。每个处理者只要知道下一个处理者是谁就可以了,耦合度很低,类似链表结构。

处理者类,处理方法的参数可以根据实际需要设置类型:

public abstract class Handler {
    protected Handler successor;

    public void setSuccessor(Handler successor) {
        this.successor = successor;
    }

    public abstract void handle(int request);
}

具体处理类:

class Manager extends Handler {

    @Override
    public void handle(int request) {
        if (request <= 3) {
            System.out.println("经理同意了" + request + "天的请假");
        } else if (successor != null) {
            System.out.println("请假天数超过经理权限");
            successor.handle(request);
        }
    }
}

class Director extends Handler {

    @Override
    public void handle(int request) {
        if (request <= 7) {
            System.out.println("总监同意了" + request + "天的请假");
        } else if (successor != null) {
            System.out.println("请假天数超过总监权限");
            successor.handle(request);
        }
    }
}

class GeneralManager extends Handler {
    @Override
    public void handle(int request) {
        if (request <= 30) {
            System.out.println("总经理同意了" + request + "天的请假");
        } else {
            System.out.println("总经理拒绝了" + request + "天的请假");
        }
    }
}

测试类:

public class Main {
    public static void main(String[] args) {

        final Manager manager = new Manager();
        final Director director = new Director();

        final GeneralManager generalManager = new GeneralManager();
        manager.setSuccessor(director);
        director.setSuccessor(generalManager);

        manager.handle(2);
        System.out.println();

        manager.handle(7);
        System.out.println();

        manager.handle(21);
        System.out.println();

        manager.handle(40);
        System.out.println();
    }
}

输出:

经理同意了2天的请假

请假天数超过经理权限
总监同意了7天的请假

请假天数超过经理权限
请假天数超过总监权限
总经理同意了21天的请假

请假天数超过经理权限
请假天数超过总监权限
总经理拒绝了40天的请假

职责链模式与状态模式

两个模式的表现十分类似,都是通过定义一个基类实现各种判断的解耦。

不过职责链模式把各种分支的关系交给调用方处理,分支间的关系可以比较灵活处理,但是也可能因为调用方操作不当导致出错的问题。

状态模式则是把分支间的关系直接耦合在分支当中了,调用方无法去修改分支间的关系,不过调用方也节省了设置分支关系的步骤,直接调用即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值