基于Guava API实现异步通知和事件回调

本文介绍了如何在Java中使用Guava框架实现观察者模式,通过创建GuavaEvent和EventListener接口,以及Event和EventBus类,展示了事件监听和发布的过程。同时,作者还通过鼠标事件响应API设计,进一步说明了观察者模式在实际应用中的运用。
摘要由CSDN通过智能技术生成

private static GPer gper = null;

private GPer(){}

public static GPer getInstance(){

if(null == gper){

gper = new GPer();

}

return gper;

}

public String getName() {

return name;

}

public void publishQuestion(Question question){

System.out.println(question.getUserName() + “在” + this.name + “上提交了一个问题。”);

setChanged();

notifyObservers(question);

}

}

然后创建问题Question类。

public class Question {

private String userName;

private String content;

public String getUserName() {

return userName;

}

public void setUserName(String userName) {

this.userName = userName;

}

public String getContent() {

return content;

}

public void setContent(String content) {

this.content = content;

}

}

接着创建老师Teacher类。

public class Teacher implements Observer {

private String name;

public Teacher(String name) {

this.name = name;

}

public void update(Observable o, Object arg) {

GPer gper = (GPer)o;

Question question = (Question)arg;

System.out.println(“======================”);

System.out.println(name + “老师,你好!\n” +

“您收到了一个来自” + gper.getName() + “的提问,希望您解答。问题内容如下:\n” +

question.getContent() + “\n” + “提问者:” + question.getUserName());

}

}

最后编写客户端测试代码。

public static void main(String[] args) {

GPer gper = GPer.getInstance();

Teacher tom = new Teacher(“Tom”);

Teacher jerry = new Teacher(“Jerry”);

gper.addObserver(tom);

gper.addObserver(jerry);

//用户行为

Question question = new Question();

question.setUserName(“张三”);

question.setContent(“观察者模式适用于哪些场景?”);

gper.publishQuestion(question);

}

运行结果如下图所示。

file

2 基于Guava API轻松落地观察者模式


笔者向大家推荐一个实现观察者模式的非常好用的框架,API使用也非常简单,举个例子,首先引入Maven依赖包。

com.google.guava

guava

20.0

然后创建侦听事件GuavaEvent。

/**

  • Created by Tom

*/

public class GuavaEvent {

@Subscribe

public void subscribe(String str){

//业务逻辑

System.out.println(“执行subscribe方法,传入的参数是:” + str);

}

}

最后编写客户端测试代码。

/**

  • Created by Tom

*/

public class GuavaEventTest {

public static void main(String[] args) {

EventBus eventbus = new EventBus();

GuavaEvent guavaEvent = new GuavaEvent();

eventbus.register(guavaEvent);

eventbus.post(“Tom”);

}

}

3 使用观察者模式设计鼠标事件响应API


再来设计一个业务场景,帮助小伙伴们更好地理解观察者模式。在JDK源码中,观察者模式的应用也非常多。例如java.awt.Event就是观察者模式的一种,只不过Java很少被用来写桌面程序。我们用代码来实现一下,以帮助小伙伴们更深刻地了解观察者模式的实现原理。首先,创建EventListener接口。

/**

  • 观察者抽象

  • Created by Tom.

*/

public interface EventListener {

}

创建Event类。

/**

  • 标准事件源格式的定义

  • Created by Tom.

*/

public class Event {

//事件源,动作是由谁发出的

private Object source;

//事件触发,要通知谁(观察者)

private EventListener target;

//观察者的回应

private Method callback;

//事件的名称

private String trigger;

//事件的触发事件

private long time;

public Event(EventListener target, Method callback) {

this.target = target;

this.callback = callback;

}

public Object getSource() {

return source;

}

public Event setSource(Object source) {

this.source = source;

return this;

}

public String getTrigger() {

return trigger;

}

public Event setTrigger(String trigger) {

this.trigger = trigger;

return this;

}

public long getTime() {

return time;

}

public Event setTime(long time) {

this.time = time;

return this;

}

public Method getCallback() {

return callback;

}

public EventListener getTarget() {

return target;

}

@Override

public String toString() {

return “Event{” +

“source=” + source +

“, target=” + target +

“, callback=” + callback +

“, trigger='” + trigger + ‘’’ +

“, time=” + time +

‘}’;

}

}

创建EventContext类。

/**

  • 被观察者的抽象

  • Created by Tom.

*/

public abstract class EventContext {

protected Map<String,Event> events = new HashMap<String,Event>();

public void addListener(String eventType, EventListener target, Method callback){

events.put(eventType,new Event(target,callback));

}

public void addListener(String eventType, EventListener target){

try {

this.addListener(eventType, target,

target.getClass().getMethod(“on”+toUpperFirstCase(eventType), Event.class));

}catch (NoSuchMethodException e){

return;

}

}

private String toUpperFirstCase(String eventType) {

char [] chars = eventType.toCharArray();

chars[0] -= 32;

return String.valueOf(chars);

}

private void trigger(Event event){

event.setSource(this);

event.setTime(System.currentTimeMillis());

try {

if (event.getCallback() != null) {

//用反射调用回调函数

event.getCallback().invoke(event.getTarget(), event);

}

}catch (Exception e){

e.printStackTrace();

}

}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

小编精心为大家准备了一手资料

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

以上Java高级架构资料、源码、笔记、视频。Dubbo、Redis、设计模式、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术

【附】架构书籍

  1. BAT面试的20道高频数据库问题解析
  2. Java面试宝典
  3. Netty实战
  4. 算法

BATJ面试要点及Java架构师进阶资料

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
码获取!!(备注Java获取)**

img

最后

小编精心为大家准备了一手资料

[外链图片转存中…(img-2wuZHKF2-1712418537961)]

[外链图片转存中…(img-qqk5Vbl2-1712418537961)]

以上Java高级架构资料、源码、笔记、视频。Dubbo、Redis、设计模式、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术

【附】架构书籍

  1. BAT面试的20道高频数据库问题解析
  2. Java面试宝典
  3. Netty实战
  4. 算法

[外链图片转存中…(img-fDQrD8ue-1712418537961)]

BATJ面试要点及Java架构师进阶资料

[外链图片转存中…(img-zlsE1G4v-1712418537962)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

  • 18
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值