设计模式之职责链模式

###前言
《亮剑》大家非常熟悉的一部电视剧了,毕竟当年很多电视台都在播放,而且拍的非常不错,得到了广大人
民群众的认可。反正自己偶尔还是会再看一看,这部电视剧自己看了至少不下三遍了。剧中非常熟悉的“二营长,
你…意大利炮呢?”(敏感词屏蔽),这个是发生在李云龙攻打平安县城的时候,不知大家还记不记得攻打之前赵刚劝过说:
“这么大规模的战役,是需要请示上级的”。军队上不同的领导对于自己领导的部队有指挥权,有自己处理事件
的范围,超出了这个范围则需要向上级请示。如果上级还不能处理,那上级再向上级的上级请示。直到能够找
到处理这个事件的领导。这个在设计模式中就是职责链模式了。

###结构图
设计模式之职责链模式_第1张图片

###代码
以下例子使用公司领导结构例子

/**
 * 公司员工抽象类
 */
public abstract class Leader {

    protected String name;

    protected Leader leader;

    public Leader getLeader() {
        return leader;
    }

    public void setLeader(Leader leader) {
        this.leader = leader;
    }

    public Leader() {
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public abstract void dealRequest(Integer day);
}

/**
 * 总经理类
 */
public class GeneralManager extends Leader {
    @Override
    public void dealRequest(Integer day) {
        System.out.println(name + "总经理处理了你的这个请求!");
    }
}

/**
 * 总监类
 */
public class Director extends Leader{


    @Override
    public void dealRequest(Integer day) {
        if (day <= 5) {
            System.out.println(name + "总监可以处理这个请求!");
        } else {
            System.out.println(name + "总监无法处理这个请求!转交" + leader.getName() + "处理");
            leader.dealRequest(day);
        }
    }
}

/**
 * 经理类
 */
public class Manager extends Leader {
    @Override
    public void dealRequest(Integer day) {
        if (day <= 2) {
            System.out.println(name + "经理可以批准");
        } else {
            System.out.println(name + " 经理无法处理这个请求!让" + leader.getName() + "总监处理!");
            leader.dealRequest(day);
        }
    }
}

/**
 * 员工类
 */
public class Employee {

    private String name;

    private Leader leader;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Leader getLeader() {
        return leader;
    }

    public void setLeader(Leader leader) {
        this.leader = leader;
    }

    public void leaveRequest(Integer day) {
        System.out.println(name + "员工想要请假" + day + "天");
        leader.dealRequest(day);
    };
}

/**
 * 测试类
 */
public class Main {

    public static void main(String[] args) throws InterruptedException {
        Leader generalManager = new GeneralManager();
        generalManager.setName("张三");
        Leader director = new Director();
        director.setName("李四");
        director.setLeader(generalManager);
        Leader manager = new Manager();
        manager.setLeader(director);
        manager.setName("王五");
        Employee employee = new Employee();
        employee.setLeader(manager);
        employee.setName("小小");
        for (int i = 1; i < 8; i ++) {
            employee.leaveRequest(i);
            System.out.println("--------------");
            Thread.sleep(2000);
        }
    }
}

###输出结果
设计模式之职责链模式_第2张图片

###总结

    职责链模式:使多个对象都有机会处理请求,从而避免请求的发起者和处理者之间的耦合关系,将一系列对象串
成一条链子,沿着这条链子传递请求,直到有一个节点处理这个请求。
    这个模式要非常注意最后一个节点,最后一个节点至少要能处理所有的请求,不然就会导致请求没人处理,就像
前言中的上级领导一样,如果上级领导不见了,或者被暗杀了,那传递的消息就没人处理,那整个链子就坏了。
    在springMVC中,对请求的处理就是一个职责链的模式,HandlerExecutionChain类负责请求的拦截执行和请
求的处理,但是他本身不处理请求,只是将请求分配给在链上注册的处理器执行,这是一种责任链的实现方式,它减少
了责任链本身与处理逻辑之间的耦合的同时,也规范了请求处理的过程。

你可能感兴趣的:(java,设计模式)