JAVA之设计模式-责任链模式

什么是责任链模式?

责任链是一种对象的行为模式,在责任链模式里,很多拥有共同属性的对象组合成一条链。来共同处理一条请求。没有特定指定某一对象来应答请求,这条请求并不知道是哪个对象响应的自己。使得在不影响客户端的情况下动态分配责任。

1.1 举例

我家一共四口人,由姐姐爸爸妈妈组成,现在我要像他们借点生活费,(最近烟钱都没有了...)姐姐的权利比较小,最多只能借我50,妈妈最多只能借我200,爸爸最多只能借我500。姐姐爸爸妈妈都能借我钱,但是每人借钱的额度有限,最后无论是谁都会给我一个响应的结果。

1.2 源代码 

借钱流程的接口类(抽象的)

/**
 * 对外使用的抽象接口
 *
 * @author san.liu
 */
public abstract class PriceHandler {

    // 用于传递请求
    protected PriceHandler priceHandler;

    public void setPriceHandler(PriceHandler priceHandler) {
        this.priceHandler = priceHandler;
    }

    /**
     * 借钱的接口
     *
     * @param price 需要借钱的金额
     * @param sb    日志
     */
    public abstract String Request(double price, StringBuffer sb);
}

姐姐借钱的实现类

/**
 * 姐姐借钱的具体实现类
 *
 * @author san.liu
 */
public class SisterPriceHandler extends PriceHandler {

    public String Request(double price, StringBuffer sb) {
        sb.append("\n我是姐姐-");
        if (price <= 50) {
            sb.append("没有超过50,我可以借给你");
        } else {
            sb.append("超出我的能力范围,你去问问爸妈吧。");
            priceHandler.Request(price, sb);
        }
        return sb.toString();
    }
}

妈妈借钱的实现类

/**
 * 妈妈借钱的具体实现类
 *
 * @author san.liu
 */
public class MotherPriceHandler extends PriceHandler {

    public String Request(double price, StringBuffer sb) {
        sb.append("\n我是妈妈-");
        if (price <= 200) {
            sb.append("没有超过200,我可以借给你");
        } else {
            sb.append("超出我的能力范围,你去问问你爸爸吧。");
            priceHandler.Request(price, sb);
        }
        return sb.toString();
    }
}

爸爸借钱的实现类

/**
 * 爸爸借钱的具体实现类
 *
 * @author san.liu
 */
public class FatherPriceHandler extends PriceHandler {

    public String Request(double price, StringBuffer sb) {
        sb.append("\n我是爸爸-");
        if (price <= 500) {
            sb.append("没有超过500,我可以借给你");
        } else {
            sb.append("小犊子,你要那么多钱干什么!");
        }
        return sb.toString();
    }
}

测试类

// 实现和家人借钱的一个测试方法
    public static void main(String[] args) {

        // 实例化所有可以借给我钱的人
        PriceHandler priceHandler1 = new SisterPriceHandler();
        PriceHandler priceHandler2 = new MotherPriceHandler();
        PriceHandler priceHandler3 = new FatherPriceHandler();

        // 将所有可以借我钱的人连在一起(责任链组装)
        priceHandler1.setPriceHandler(priceHandler2);
        priceHandler2.setPriceHandler(priceHandler3);

        // 测试执行
        StringBuffer sb = new StringBuffer();
        System.out.println(priceHandler1.Request(40, sb));
        System.out.println(priceHandler1.Request(201, sb));
        System.out.println(priceHandler1.Request(501, sb));
    }

log:
       
    我是姐姐-没有超过50,我可以借给你


    我是姐姐-超出我的能力范围,你去问问爸妈吧。
    我是妈妈-超出我的能力范围,你去问问你爸爸吧。
    我是爸爸-没有超过500,我可以借给你


    我是姐姐-超出我的能力范围,你去问问爸妈吧。
    我是妈妈-超出我的能力范围,你去问问你爸爸吧。
    我是爸爸-小犊子,你要那么多钱干什么!

PS:选择StringBuffer的原因是可以更明确的看出整个借钱流程。。。小细节问题

1.3 总结

所有的实现类都继承PriceHandler 这个抽象类,也就是说都可以借给我钱(这是共同点),也是责任链组装在一起必然要素,这种实现方法方便后续的添加,比如我要向爷爷借钱,直接添加爷爷的具体实现类,并组装到责任链中,降低了程序的耦合,而对于我来说,并不关心是谁借我钱。对于客户端来说,我并不知道是谁来响应的我,也就实现可客户端与后台的解耦。

1.4 优点

  • 抽象类方法实现简单
  • 解耦

1.5 缺点

  • 内存消耗大

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值