文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-07-05 02:33

关注

本文小编为大家详细介绍“Java两大工具库Commons和Guava如何使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java两大工具库Commons和Guava如何使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

正文

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

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

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

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

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

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

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

先定义观察者

public class AliPayObserver {    // 标记当前订阅者是线程安全的,支持并发接收消息    @AllowConcurrentEvents    @Subscribe    public void pay(Account account) {        if (account.getName().equalsIgnoreCase("ALI")) {            System.out.println("支付宝 >>>>>> 已付款");            System.out.println(account.getMessage());        }    }}
public class WeixinObserver {    // 标记当前订阅者是线程安全的,支持并发接收消息    @AllowConcurrentEvents    @Subscribe    public void pay(Account account) {        if (account.getName().equalsIgnoreCase("WEIXIN")) {            System.out.println("微信 >>>>>> 已付款");            System.out.println(account.getMessage());        }    }}
public class YuePayObserver {    // 标记当前订阅者是线程安全的,支持并发接收消息    @AllowConcurrentEvents    @Subscribe    public void pay(Account account) {        if (account.getName().equalsIgnoreCase("YUE")) {            System.out.println("余额 >>>>>> 已付款");            System.out.println(account.getMessage());        }    }}

然后定义账户类

public class Account {    private String name;    private double amount;    private Date date;    public Account(String name, double amount, Date date) {        this.name = name;        this.amount = amount;        this.date = date;    }    public String getName() {        return name;    }    public String getMessage() {        StringBuilder sb = new StringBuilder();        sb.append("账户:").append(this.name).append(", ");        sb.append("金额:").append(amount).append(", ");        sb.append("日期:").append(date);        return sb.toString();    }}

最后实现事件总线

public class EventBusTest {    // 回调通知    public static void notifyObserver() {        EventBus bus = new EventBus();        AliPayObserver ali = new AliPayObserver();        WeixinObserver weixin = new WeixinObserver();        YuePayObserver yue = new YuePayObserver();        bus.register(ali);        bus.register(weixin);        bus.register(yue);        Account account1 = new Account("ALI", 1.6, new Date());        bus.post(account1);        Account account2 = new Account("WEIXIN", 2.2, new Date());        bus.post(account2);        Account account3 = new Account("YUE", 3, new Date());        bus.post(account3);    }    public static void main(String[] args) throws InterruptedException {        notifyObserver();    }}

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

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

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

public interface HouseWork {    public void dry();}
public class Woman implements HouseWork {    @Override    public void dry() {        System.out.println("可以晾衣服了");    }}

创建Subject:

public class WashingMachine {    private Vector<HouseWork> vector = new Vector<>();    public void register(HouseWork work) {        vector.add(work);    }    public void unregister(HouseWork work) {        vector.remove(work);    }    public void notifyObserver() {        for (HouseWork work : vector) {            work.dry();        }    }    public static void main(String[] args) throws InterruptedException {        // 洗衣机        WashingMachine machine = new WashingMachine();        // 女主人        Woman woman = new Woman();        // 洗衣机让女主人成为自己的观察者        machine.register(woman);        System.out.println("将衣服放到洗衣机。。。");        System.out.println("买菜、遛娃中。。。");        Thread.sleep(3000);        // 通知观察者(女主人),衣服洗完了        machine.notifyObserver();    }}

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

public class Man {    @Subscribe    public void dry(Sheet sheet) {        System.out.println("可以晾 " + sheet.getName() + " 床单了");    }}
public class EventBusTest {    // 回调通知    public static void notifyObserver() {        EventBus bus = new EventBus();        Man man = new Man();        bus.register(man);        bus.post(new Sheet("富安娜"));    }    public static void main(String[] args) {        notifyObserver();    }}
public class Sheet {    private String name;    public Sheet(String name) {        this.name = name;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}

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

读到这里,这篇“Java两大工具库Commons和Guava如何使用”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯