博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式——责任链模式
阅读量:6277 次
发布时间:2019-06-22

本文共 2177 字,大约阅读时间需要 7 分钟。

设计模式——责任链模式

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

从字面意思可以理解,责任链模式重点在上。只要符合相应的处理逻辑的就进去处理,不然一直传递下去。

所以我们可以得出责任链的通用类图。重点在于每一个链节点的表示。所以需要先抽象出来一个链节点。

其实在程序设计中也有这种情况,例如我们在系统中收到这样的一个需求,对于金额进行换算,由于一开始的时候没有想到有那么多币种,所以只针对于人民币进行了结算,但是随后由于国际化的业务。来了许多币种的,这时候就可以用责任链模式进行补救。

首先定义抽象的处理器

abstract class MoneyHandler{	 //币种    private String currency;    private MoneyHandler moneyHandler = null;    public MoneyHandler(String currency){        this.currency = currency;    }    public final void handlerRequest(Money money){    	 //是否停留在此链点的标准,不符合就进入下一个链点        if (currency.equals(money.getCurrency())){            invoke(money);        }else {            if (getNext()!=null){                getNext().handlerRequest(money);            }else {                System.out.println("未知币种:"+money.getCurrency());            }        }    }    public MoneyHandler getNext(){        return this.moneyHandler;    }    public MoneyHandler setNext(MoneyHandler moneyHandler){        this.moneyHandler = moneyHandler;        return moneyHandler;    }   public abstract void invoke(Money money);}复制代码

两个币种的处理器人民币和美元的

class CNYMoneyHandler extends MoneyHandler {    public CNYMoneyHandler(String currency) {        super(currency);    }    @Override    public void invoke(Money money) {        System.out.println("人民币处理");    }}class USDMoneyHandler extends MoneyHandler {    public USDMoneyHandler(String currency) {        super(currency);    }    @Override    public void invoke(Money money) {        System.out.println("美元处理");    }}class Money{    private String currency;    private BigDecimal amount;}复制代码

此时进行如下调用就能走到相应的处理链节点了

MoneyHandler cny = new CNYMoneyHandler("CNY");        MoneyHandler usd = new USDMoneyHandler("USD");        Money cnyMoney = new Money("CNY",new BigDecimal("100"));        Money usdMoney = new Money("USD",new BigDecimal("100"));        Money noMoney = new Money("BBBBBBB",new BigDecimal("100"));        //设置链的下一个节点        cny.setNext(usd);        cny.handlerRequest(cnyMoney);        cny.handlerRequest(usdMoney);        cny.handlerRequest(noMoney);复制代码

输出如下

人民币处理美元处理未知币种:BBBBBBB复制代码

转载于:https://juejin.im/post/5cb03adaf265da039c054157

你可能感兴趣的文章
关于typedef的用法总结
查看>>
Apache用户认证、域名跳转、访问日志格式
查看>>
mwArray类说明
查看>>
CMD命令行:查看 Windows 操作系统的安装时间
查看>>
mysql explain
查看>>
golang交叉编译工具,gox使用入门
查看>>
Redis Master-Slave 读写分离测试
查看>>
git bash常用命令行以及初次接触yo以及bower
查看>>
修改MySQL默认空密码
查看>>
spring mvc访问静态文件(css/js/img)访问不到
查看>>
spring boot框架学习学前掌握之重要注解(1)-sprng的java配置方式
查看>>
plsql 书籍基础表结构
查看>>
nginx 第三方模块 modsecurity安装使用
查看>>
Kettle使用问题记录
查看>>
Android 透明(沉浸式)状态栏设计
查看>>
关于UIView的autoresizingMask属性
查看>>
sparkSQL UDF创建
查看>>
spring4中获取泛型的bean
查看>>
Ansible notes
查看>>
js实现二叉树
查看>>