大话设计模式学习笔记(24)——职责链模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/q1052196521/article/details/79730856

问题提出

小明想要请个假,但由于种种原因不得不一直向上层层传递到总经理。设请假的级别为10。组长处理的级别为1~5,经理处理的级别为6~8,总经理处理的级别为9~10。用代码实现这个请假场景。

职责链模式

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

package chainofresponsibility;

public class ChainOfResponsibility {
    public static void main(String[] args) {
        //初始化三个人
        Manager leader = new Leader();
        Manager director = new Director();
        Manager boss = new Boss();

        //设置彼此之间的上下级关系
        leader.setSuperManager(director);
        director.setSuperManager(boss);

        //处理小明请假的事情 等级为10
        leader.dealThings(10);
    }
}

/**
 * 管理者接口
 */
interface Manager {
    //根据事情能级处理
    void dealThings(int level);

    void setSuperManager(Manager manager);
}

/**
 * 组长
 */
class Leader implements Manager {
    private Manager superManager;

    //设置上级
    @Override
    public void setSuperManager(Manager manager) {
        superManager = manager;
    }

    @Override
    public void dealThings(int level) {
        if (level < 5) {
            System.out.println("组长成功处理事情");
        } else {
            //处理不了则上抛
            superManager.dealThings(level);
        }
    }
}

/**
 * 经理
 */
class Director implements Manager{
    private Manager superManager;

    //设置上级
    @Override
    public void setSuperManager(Manager manager) {
        superManager = manager;
    }

    @Override
    public void dealThings(int level) {
        if (level < 8) {
            System.out.println("经理成功处理事情");
        } else {
            //处理不了则上抛
            superManager.dealThings(level);
        }
    }
}
class Boss implements Manager{
    @Override
    public void dealThings(int level) {
        System.out.println("总经理成功处理事情");
    }

    @Override
    public void setSuperManager(Manager manager) {
        System.out.println("boss无上级");
    }
}

输出:
总经理成功处理事情

其实我感觉职责链模式的设计和装饰模式有很多相似之处:都是定义一个接口然后在子类中保留该接口的引用。在deal()方法中调用这个引用的deal()方法。
只不过这两者定义不同。装饰模式侧重在原实现类的基础上进行其他实现类的层层包装,而职责链模式则侧重于自己是否该处理这个请求。处理不了才抛给另外一个实现类进行处理。

plantuml

@startuml
interface Manager{
{abstract}dealThings(int level);
{abstract}setSuperManager(Manager manager);
}

Manager <..* Leader
Manager <|.. Leader
class Leader{
Manager superManager
dealThings(int level);
setSuperManager(Manager manager);
}

Manager <..* Director
Manager <|.. Director
class Director{
Manager superManager
dealThings(int level);
setSuperManager(Manager manager);
}

Manager <..* Boss
Manager <|.. Boss
class Boss{
Manager superManager
dealThings(int level);
setSuperManager(Manager manager);
}
@enduml

这里写图片描述

猜你喜欢

转载自blog.csdn.net/q1052196521/article/details/79730856
今日推荐