《设计模式就该这样学》之基于Guava API实现异步通知和事件回调

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

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

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

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

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);

}

运行结果如下图所示。

图片

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();

}

}

protected void trigger(String trigger){

if(!this.events.containsKey(trigger)){return;}

trigger(this.events.get(trigger).setTrigger(trigger));

}

}

然后创建MouseEventType接口。

/**

  • Created by Tom.

*/

public interface MouseEventType {

//单击

String ON_CLICK = “click”;

//双击

String ON_DOUBLE_CLICK = “doubleClick”;

//弹起

String ON_UP = “up”;

//按下

String ON_DOWN = “down”;

//移动

String ON_MOVE = “move”;

//滚动

String ON_WHEEL = “wheel”;

//悬停

String ON_OVER = “over”;

//失去焦点

String ON_BLUR = “blur”;

//获得焦点

String ON_FOCUS = “focus”;

}

创建Mouse类。

/**

  • 具体的被观察者

  • Created by Tom.

*/

public class Mouse extends EventContext {

public void click(){

System.out.println(“调用单击方法”);

this.trigger(MouseEventType.ON_CLICK);

}

public void doubleClick(){

System.out.println(“调用双击方法”);

this.trigger(MouseEventType.ON_DOUBLE_CLICK);

}

public void up(){

System.out.println(“调用弹起方法”);

this.trigger(MouseEventType.ON_UP);

}

public void down(){

System.out.println(“调用按下方法”);

this.trigger(MouseEventType.ON_DOWN);

}

public void move(){

System.out.println(“调用移动方法”);

this.trigger(MouseEventType.ON_MOVE);

}

最后

针对以上面试题,小编已经把面试题+答案整理好了

最新大厂必问微服务面试题汇总:SpringCloud、Boot、Dubbo

最新大厂必问微服务面试题汇总:SpringCloud、Boot、Dubbo

最新大厂必问微服务面试题汇总:SpringCloud、Boot、Dubbo

面试专题

image

除了以上面试题+答案,小编同时还整理了微服务相关的实战文档也可以分享给大家学习

image

image

image

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

转存中…(img-6r1XD8UE-1713658459507)]

[外链图片转存中…(img-mYD4FfPl-1713658459507)]

[外链图片转存中…(img-bMBLcYni-1713658459508)]

面试专题

[外链图片转存中…(img-0X1Xb0pm-1713658459508)]

除了以上面试题+答案,小编同时还整理了微服务相关的实战文档也可以分享给大家学习

[外链图片转存中…(img-Oa6q0OES-1713658459509)]

[外链图片转存中…(img-9YJisbkO-1713658459509)]

[外链图片转存中…(img-tdZtQlel-1713658459510)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-uubyuydD-1713658459510)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 14
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Guava是一个非常受欢迎的Java库,它提供了许多实用的API和工具,用于增强Java编程体验和性能。Guava API文档提供了对所有Guava功能和类的详细说明。 在Guava API文档中,你可以找到大量有关Guava库的信息。首先,你会发现一个全面的类和接口索引,它列出了每个Guava类的概述和用法。通过这个索引,你可以方便地找到你需要的特定功能。 接着,对于每个类和接口,文档提供了更详细的解释。它描述了该类的用途、主要方法和示例代码。这对于初次接触Guava的开发者来说非常有帮助,因为他们可以了解如何正确地使用Guava的各种功能。 此外,API文档还提供了Guava的功能性组件的概述。例如,你可以找到Collections、Strings、Files、Caches、Events等功能的专门章节。这些章节详细介绍了这些组件的主要功能和特性,并提供了示例代码和用例。 最后,API文档还提供了一些额外的资源,比如指南和教程,以及社区支持和其他相关资源的链接。这些资源可以帮助你深入了解Guava,并解决在使用Guava过程中可能遇到的问题。 总之,Guava API文档是使用Guava的开发者不可或缺的参考。它提供了对Guava库功能的全面了解,帮助开发者快速习和正确使用Guava的各种功能和工具。无论你是初者还是有经验的开发者,Guava API文档都将成为你习和使用Guava的宝贵资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值