设计模式之责任链模式(Chain of Responsibity)

本文介绍了一种设计模式——责任链模式,并通过一个薪资审批流程的实际案例进行详细解析。该模式能够有效解耦请求发送者与接收者,适用于多个对象可能处理同一请求的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.解析

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

UML :

这里写图片描述


2.实例

背景描述 :
在前面的场景中 ,我们使用的是餐厅的例子 ,在这里可以继续延用 : 薪资问题
人员结构 :
* 基层 : 服务员 ,洗碗工
* 中层 :大厅经理,后厨主任
* 上层 :总经理
* 高层 :老板
* 强级 :老板娘
场景 :
* 基层 : 想要申请 加薪;
* 中层: 最高给 其 加薪 1000元
* 高层 :最高给其加薪 2000元
* 老板 :最高给其加薪 3000元
* 老板娘 : 最高给其加薪 4000元 或者 “ 不干滚蛋 ”

实现步骤 :

层级结构构建 : 管理层实现

(1)实现 SalaryHandler : 抽象类 ,抽象方法 :addSalary(int salary);

public abstract class SalaryHandler {

    //用于构建 责任链 的 链 ,是 所有层级(除了基层)的父类
    private SalaryHandler salaryHandler;

    public SalaryHandler getSalaryHandler() {
        return salaryHandler;
    }

    public void setSalaryHandler(SalaryHandler salaryHandler) {
        this.salaryHandler = salaryHandler;
    }

    public abstract void addSalary(int salary);

}

(2)中层人员实现 : 大厅经理 ,后厨主任 ,控制加薪 1000元以内

public class ZhongCengHandler extends SalaryHandler {

/**
 * 中层实现
 */

    @Override
    public void addSalary(int salary) {
        if(salary<=1000){
            System.out.println(this.getClass().getName()+" :给 您加薪 "+salary+" 元");
        }else{
            getSalaryHandler().addSalary(salary);
        }
    }

}

(3)高层人员 : 总经理 ,控制加薪 2000元

public class GaoCengHandler extends SalaryHandler{

    /**
     * 高层实现
     */

    @Override
    public void addSalary(int salary) {

        if(salary<=2000){
            System.out.println(this.getClass().getName()+" :给 您加薪 "+salary+" 元");
        }else{
            getSalaryHandler().addSalary(salary);
        }

    }

}

(4) Boss 老板 :控制加薪 3000元

public class BossHandler extends SalaryHandler {


    /**
     * 老板 最多加薪 3000元
     * 
     */

    @Override
    public void addSalary(int salary) {
        if(salary<3000){
            System.out.println(this.getClass().getName()+" :给 您加薪 "+salary+" 元");
        }else{
            getSalaryHandler().addSalary(salary);
        }
    }

}

(5) BossWife : 老板娘 ,控制加薪4000元 和 辞员

public class BossWifeHandler extends SalaryHandler{

    /**
     * 老板娘 4000元
     * 或 滚蛋
     */

    @Override
    public void addSalary(int salary) {
        if(salary<4000){
            System.out.println(this.getClass().getName()+" :给您加薪 "+salary+" 元");
        }else{
            System.out.println(this.getClass().getName()+" : 不干滚蛋 !");
        }
    }

}

层级结构实现 : 关联各个层之间的衔接

(6) SalaryFactory : 使用简单工厂模式 实现 各层之间的关联

public class SalaryFactory {

    /**
     * 关联起来 所有的 层
     */
    public static SalaryHandler getSalaryHandlerInstance(){

         ZhongCengHandler zhongCengHandler=new ZhongCengHandler();
         GaoCengHandler gaoCengHandler=new GaoCengHandler();
         BossHandler bossHandler=new BossHandler();
         BossWifeHandler bossWifeHandler=new BossWifeHandler();

         //关联
         zhongCengHandler.setSalaryHandler(gaoCengHandler);
         gaoCengHandler.setSalaryHandler(bossHandler);
         bossHandler.setSalaryHandler(bossWifeHandler);

         return zhongCengHandler;

    }

}

层级结构实现 : 基层实现

(7) JiCengPerson : 基层人员 实现 申请加薪

public class JiCengPerson {

    private String name;

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

    /**
     * 给上级说
     */
    public void sayAddSalary(int salary) {
        System.out.println(name + " : 我要加薪  " + salary + "元 !!!懂?");
        SalaryHandler handler = SalaryFactory.getSalaryHandlerInstance();
        handler.addSalary(salary);
    }

}

测试实现

(8)测试

    public static void main(String[] args) {

        //基层提出 加薪
        JiCengPerson xw=new JiCengPerson("小王");
        xw.sayAddSalary(1100);

        JiCengPerson xy=new JiCengPerson("小原");
        xy.sayAddSalary(5100);

    }

结果 :

这里写图片描述


3.优缺点

优点:
1. 将请求的发送者和接收者解耦 ;
2. 可以简化你的对象,因为它不需要知道链的结构 ;
3. 通过改变链内的成员或调动他们的次序,允许你动态地新增或删除责任;

缺点:
1. 并不保证请求一定会被执行,如果没有任何对象处理它的话,它可能会落到链尾端 之外 ;
2. 可能不容观察运行时的特征,有碍于除错。
3. 开始就会加载很多实例,消耗内存


4.使用场景

(1)有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。

(2)你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。

(3)可处理一个请求的对象集合应被动态指定。


5.Demo 免积分下载

http://download.youkuaiyun.com/detail/lablenet/9304489

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值