职责链模式

117 阅读1分钟
/**
 * 职责链模式
 * 个人理解:多个接收者按顺序处理请求,每个接收者都有可能处理请求。请求和接收者解耦
 *  组件:抽象处理类(Handler)、具体处理类(ConcreteHandler)、客户端(Client)
 *  场景举例:审批流
 *  优点:减少连接,只维护一个指向,对象只需知道第一个处理者。增加新处理者简单,符合开闭原则。
 *  缺点:链如果过长,可能会影响效率。设计不好,可能会闭环,可能请求漏处理。
 */
public class ChainDesignerPattern {
    public static void main(String[] args) {

        Person teacher = new Teacher();
        Person director = new Director();
        Person master = new Master();
        teacher.setNext(director);
        director.setNext(master);

        teacher.handler(3);
    }
}

abstract class Person {

    private Person next;

    public abstract void handler(int days);

    public Person getNext() {
        return next;
    }

    public void setNext(Person next) {
        this.next = next;
    }
}

class Teacher extends Person {

    @Override
    public void handler(int days) {
        if (days<0) {
            throw new IllegalArgumentException("无效参数");
        } else if (days<=7) {
            System.out.println("班主任批假");
        } else {
            super.getNext().handler(days);
        }
    }
}

class Director extends Person {

    @Override
    public void handler(int days) {
        if (days<=30) {
            System.out.println("系主任批假");
        } else {
            super.getNext().handler(days);
        }
    }
}

class Master extends Person {

    @Override
    public void handler(int days) {
        System.out.println("校长批假");
    }
}