设计模式—责任链模式

2021-05-09  本文已影响0人  JackDaddy

一、定义

    顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者接收者进行解耦。这种类型的设计模式属于行为型模式。在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。

1.1 解决问题:

    职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。

1.2 优点:
1.3 缺点:

二、例子

    接下来用一个例子来说明责任链设计模式。程序员每次要出差需要出差经费,而经费需要领导审批,各级领导可以审批的金额限度不一致,因此不同的出差经费需要由不同的领导审批:
程序员抽象类:

/**
 * 抽象程序员
 */
public abstract class ProgramApe {
    /**
     * 获取程序员具体的差旅费用
     * @return 具体费用
     */
    public abstract int getExpress();

    /**
     * 获取差旅费申请
     *
     * @return 申请内容
     */
    public abstract String getApply();
}

具体程序员:

/**
 * Android 程序员
 *
 */
public class AndroidApe extends ProgramApe{

    // 声明整型成员变量表示出差费用
    private int express;
    // 声明字符串型成员变量表示差旅申请
    private String apply = "Android - 要钱出差去";

    public AndroidApe(int express) {
        this.express = express;
    }

    @Override
    public int getExpress() {
        return express;
    }

    @Override
    public String getApply() {
        return apply;
    }
}

领导抽象类:

/**
 * 领导-抽象类
 */
public abstract class Leader {
    // 当前领导能批复的金额
    private int mEexpress;
    //上级领导
    private Leader mSuperiorLeader;

    /**
     * 当前领导可审批的金额
     *
     * @param express 审批金额
     */
    public Leader(int express) {
        mEexpress = express;
    }

    /**
     * 回应程序员
     *
     * @param mApe 具体程序员
     */
    protected abstract void reply(ProgramApe mApe);

    /**
     * 设置上级领导
     *
     * @param mSuperiorLeader 具体的上级领导
     */
    public void setSuperiorLeader(Leader mSuperiorLeader) {
        this.mSuperiorLeader = mSuperiorLeader;
    }

    /**
     * 处理请求
     */
    public void handleRequest(ProgramApe mApe) {

        // 如果说程序猿申请的money在当前领导的批复范围内
        if (mApe.getExpress() <= mEexpress) {
            reply(mApe);
        } else {
            // 否则看看当前领导是否有上级
            if (null == mSuperiorLeader) {
                // 没有上级的话就批复不了
                System.out.println("Goodbye my money......");
            } else {
                // 有的话简单撒直接扔给上级处理即可
                mSuperiorLeader.handleRequest(mApe);
            }
        }
    }
}

小组领导:

/**
 * 小组领导
 */
public class GroupLeader extends Leader {


    /**
     * 当前领导可审批的金额
     */
    public GroupLeader() {
        super(1000);
    }

    @Override
    protected void reply(ProgramApe mApe) {
        System.out.println(mApe.getApply());
        System.out.println("GroupLeader: Of course Yes!");
    }
}

项目主管:

/**
 * 项目主管
 */
public class DirectorLeader extends Leader{

    public DirectorLeader() {
        super(2000);
    }

    @Override
    protected void reply(ProgramApe mApe) {
        System.out.println(mApe.getApply());
        System.out.println("DirectorLeader: Of course Yes!");
    }
}

经理:

/**
 * 经理
 */
public class ManagerLeader extends Leader {

    public ManagerLeader() {
        super(3000);
    }

    @Override
    protected void reply(ProgramApe mApe) {
        System.out.println(mApe.getApply());
        System.out.println("DirectorLeader: Of course Yes!");
    }
}

客户端:

public class Client {

    public static void main(String[] args) {
        //程序员经费-3000以内
        int fee = (int) (Math.random() * 3000);
        System.out.println("程序员经费:" + fee);
        ProgramApe programApe = new AndroidApe(fee);

        //设置领导
        Leader mGroupLeader = new GroupLeader();
        Leader mDirectorLeader = new DirectorLeader();
        Leader mManagerLeader = new ManagerLeader();

        //设置上级领导
        mGroupLeader.setSuperiorLeader(mDirectorLeader);
        mDirectorLeader.setSuperiorLeader(mManagerLeader);

        //处理请求
        mGroupLeader.handleRequest(programApe);

    }
}
上一篇下一篇

猜你喜欢

热点阅读