Java两大工具库Commons和Guava如何使用(commons,guava,java,开发技术)

时间:2024-04-29 11:44:00 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

正文

除了操作集合、限流和缓存,Guava还有另一个隐秘的功能:事件总线EventBus机制——是发布-订阅模式的实现,不需要显式地注册回调——比观察者模式更灵活。

EventBus是在单体架构内实现松耦合的一种很好的手段,通过它可以实现与业务逻辑无关的事件监听和消费。Guava提供的事件总线EventBus分为两种:

  • 1、同步事件EventBus,主要用于单线程环境;

  • 2、异步事件AsyncEventBus,主要用于多线程环境。

可以稍稍回顾一下观察者模式。

在支付系统的设计模式中,当完成交易后,需要给用户发送通知时就使用到了观察者模式,怎么做的呢?

  • 1、定义账户观察者接口及其子接口支付观察者和积分观察者;

  • 2、支付抽象类实现这两个子接口,具体支付类阿里支付、微信支付和余额支付,也都分别实现这两个子接口;

  • 3、在账户类中加入观察者接口列表,并增加注册、删除和调用观察者接口的方法;

  • 4、在支付时将各类支付方式注册到账户的观察者列表中;

  • 5、在交易完成后,就可以调用账户的调用观察者接口的方法,实现回调。

Java两大工具库Commons和Guava如何使用

观察者模式的实现稍嫌麻烦。

既然用观察者模式实现比较麻烦,那不妨换个思路,用Guava EventBus来实现,而且无需继承任何接口。调用、发送回调通知同样也很简单,用EventBus把支付回调再来实现一遍。

先定义观察者

/***支付宝观察者**@author湘王*/publicclassAliPayObserver{//标记当前订阅者是线程安全的,支持并发接收消息@AllowConcurrentEvents@Subscribepublicvoidpay(Accountaccount){if(account.getName().equalsIgnoreCase("ALI")){System.out.println("支付宝>>>>>>已付款");System.out.println(account.getMessage());}}}
/***微信支付观察者**@author湘王*/publicclassWeixinObserver{//标记当前订阅者是线程安全的,支持并发接收消息@AllowConcurrentEvents@Subscribepublicvoidpay(Accountaccount){if(account.getName().equalsIgnoreCase("WEIXIN")){System.out.println("微信>>>>>>已付款");System.out.println(account.getMessage());}}}
/***余额支付观察者**@author湘王*/publicclassYuePayObserver{//标记当前订阅者是线程安全的,支持并发接收消息@AllowConcurrentEvents@Subscribepublicvoidpay(Accountaccount){if(account.getName().equalsIgnoreCase("YUE")){System.out.println("余额>>>>>>已付款");System.out.println(account.getMessage());}}}

然后定义账户类

/***账户**@author湘王*/publicclassAccount{privateStringname;privatedoubleamount;privateDatedate;publicAccount(Stringname,doubleamount,Datedate){this.name=name;this.amount=amount;this.date=date;}publicStringgetName(){returnname;}publicStringgetMessage(){StringBuildersb=newStringBuilder();sb.append("账户:").append(this.name).append(",");sb.append("金额:").append(amount).append(",");sb.append("日期:").append(date);returnsb.toString();}}

最后实现事件总线

/***事件总线**@author湘王*/publicclassEventBusTest{//回调通知publicstaticvoidnotifyObserver(){EventBusbus=newEventBus();AliPayObserverali=newAliPayObserver();WeixinObserverweixin=newWeixinObserver();YuePayObserveryue=newYuePayObserver();bus.register(ali);bus.register(weixin);bus.register(yue);Accountaccount1=newAccount("ALI",1.6,newDate());bus.post(account1);Accountaccount2=newAccount("WEIXIN",2.2,newDate());bus.post(account2);Accountaccount3=newAccount("YUE",3,newDate());bus.post(account3);}publicstaticvoidmain(String[]args)throwsInterruptedException{notifyObserver();}}

运行main方法,可以看到,尽管没有显式声明观察者接口,但通过一个@Subscribe注解,就完成了方法回调。这就是EventBus比观察者模式要灵活强大的地方。

如果还不满足,那就再来一个例子。

创建观察者接口和具体观察者

/***做家务的接口**@author湘王*/publicinterfaceHouseWork{publicvoiddry();}
/***女主人(具体做家务的人)**@author湘王*/publicclassWomanimplementsHouseWork{@Overridepublicvoiddry(){System.out.println("可以晾衣服了");}}

创建Subject:

/***洗衣机(Subject类)**@author湘王*/publicclassWashingMachine{privateVector<HouseWork>vector=newVector<>();publicvoidregister(HouseWorkwork){vector.add(work);}publicvoidunregister(HouseWorkwork){vector.remove(work);}publicvoidnotifyObserver(){for(HouseWorkwork:vector){work.dry();}}publicstaticvoidmain(String[]args)throwsInterruptedException{//洗衣机WashingMachinemachine=newWashingMachine();//女主人Womanwoman=newWoman();//洗衣机让女主人成为自己的观察者machine.register(woman);System.out.println("将衣服放到洗衣机。。。");System.out.println("买菜、遛娃中。。。");Thread.sleep(3000);//通知观察者(女主人),衣服洗完了machine.notifyObserver();}}

用EventBus把刚才家庭妇女做家务的例子再来做一遍(现在换成家庭妇男):

/***具体观察者**@author湘王*/publicclassMan{@Subscribepublicvoiddry(Sheetsheet){System.out.println("可以晾"+sheet.getName()+"床单了");}}
/***事件总线**@author湘王*/publicclassEventBusTest{//回调通知publicstaticvoidnotifyObserver(){EventBusbus=newEventBus();Manman=newMan();bus.register(man);bus.post(newSheet("富安娜"));}publicstaticvoidmain(String[]args){notifyObserver();}}
/***床单实体类**@author湘王*/publicclassSheet{privateStringname;publicSheet(Stringname){this.name=name;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}}

运行main方法,可以看到和之前一样的效果。事件总线的一个缺点是,回调接口必须有参数,这并不友好。

 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:Java两大工具库Commons和Guava如何使用的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:python字符串大小写转换的方法有哪些下一篇:

10 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18