java中回调函数的实现

在java的事务中,有时候可能会遇到以下情况,第一步是更新某某表,中间可能要更新不确定的多步,最后一步是更新缓存,结构大致如下:

(1)updateA();

(2)updateXX();   //此步骤可能有也可能没有,也可能有多个

(3)updateCache();

此时,因为第二步的不确定性,导致代码不太好写,而我们的更新缓存又必须放在最后一步,那么我们可以使用回调机制来处理。

(更新缓存放在最后一步可以保证以上步骤中任何一步更新出错都可以回滚,如果放在中间的话,更新缓存后面的更新出错了,则更新缓存这一步不会回滚,因为更新缓存不与数据库打交道。)

示例代码如下:

 

package alan_test;


public class TestCallBack {

  private void updateDB() {
    System.out.println("update DB");
  }

  private void updateCache() {
    System.out.println("update Cache");
  }

  public void update( CallBack callBack ) {
    updateDB();

    if(callBack != null) {
      callBack.doSth();
    }

    updateCache();
  }

  public static void main( String[] args ) {
    TestCallBack testCallBack = new TestCallBack();

    testCallBack.update(new CallBack() {
      @Override
      public void doSth() {
        new AnotherClass().updateXXX();
      }
    });

    System.out.println("-------------------------------------------");

    testCallBack.update(null);
  }
}

class AnotherClass {
  void updateXXX() {
    System.out.println("update XXX");
  }
}

interface CallBack {
  void doSth();
}

运行结果为:

 

其中,CallBack的dowSth()中可以添加一系列的更新方法以实现复杂的业务需求的需要。

从设计模式的角度来看,以上这种更倾向于策略模式,如果是监听器方式的回调则更倾向于观察者模式。

注:大家对spring事务操作怎么保证redis缓存与数据库一致有什么好的建议也一起来共享下,谢谢。

(吐槽一下:为什么java中函数不能当做对象使用抓狂,像javascript中那样直接传函数回调多简单微笑

欢迎关注我的公众号“彤哥读源码”,查看更多“源码&架构&算法”系列文章, 与彤哥一起畅游源码的海洋。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值