美文网首页
设计模式—责任链模式

设计模式—责任链模式

作者: JackDaddy | 来源:发表于2021-05-09 22:36 被阅读0次

一、定义

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

1.1 解决问题:

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

1.2 优点:
  • 1、降低耦合度。它将请求的发送者和接收者解耦。
  • 2、简化了对象。使得对象不需要知道链的结构。
  • 3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
  • 4、增加新的请求处理类很方便。
1.3 缺点:
  • 1、不能保证请求一定被接收。
  • 2、系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。
  • 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);

    }
}

相关文章

网友评论

      本文标题:设计模式—责任链模式

      本文链接:https://www.haomeiwen.com/subject/xhxpdltx.html