Java EE重新审视设计模式:观察者

除了以多种语言和许多应用程序实现之外,Observer Pattern自1.0版以来一直是Java的一部分。 观察者模式也是好莱坞原则的良好实施。 就像好莱坞的特工喜欢回调候选人以代替某个职位,而不是每天被要求询问可用工作一样,大多数服务器端资源(例如将可用数据推送到适当的客户端)而不是被要求一次更新。间隔。

这样的时间间隔查询不仅会消耗服务器上的大量资源,还会导致网络流量超出实际需要。 尽管Java从第0天开始就支持Observer Pattern,但始终认为它不是最佳实现(请参阅Observer和Observable )。 进入JavaEE世界甚至会使事情复杂化。 但是,JavaEE6带有替代方法。

JavaEE6提供了“ @Observable”注释,作为Observer Pattern的现成的简便实现。 让我们访问上一篇文章 ,并将其扩展为使用观察者。

package com.devchronicles.observer;import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.enterprise.event.Event;
import javax.inject.Inject;/**** @author Murat Yener*/
@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class EventService {@Injectprivate String message;@Inject Event<String> event;public void startService(){System.out.println("start service call "+message);event.fire("this is my "+message);System.out.println("done...");}
}

将向EventService类注入String类型的Event对象,该事件对象可用于触发String对象。 如果您没有阅读上一篇文章,则message对象是一个String,它将由工厂产生并注入到EventService类中。 为简化起见,您可以在名为message的变量中键入任何字符串常量。

既然我们已经完成了可观察部分,那么现在该创建一个观察者来监听我们的事件了。

package com.devchronicles.observer;import javax.ejb.Stateless;
import javax.enterprise.event.Observes;/**** @author Murat Yener*/
@Stateless
public class EventObserver {public void doLogging(@Observes String message){System.out.println("Observed:"+message);}
}

Observes注释将方法标记为已触发的String事件的观察者。 如果运行服务器并启动start service方法,您将认识到如何将字符串神奇地注入EventService类,然后将其触发到EventObserver类将其嘲笑(观察到)的位置。 令人惊讶的是,这是在JavaEE6中实现观察者模式所需的全部。

如前所述,JavaEE6提供了一种简单的方法来实现观察者模式。 发布该帖子后,我收到了关于如何区分触发和观察到的字符串类型的几个问题。

尽管在现实世界中,您可能不会触发和观察纯字符串,但是您自己的对象将按其类型进行观察,但是区分相同类型的对象并设置不同的观察者来侦听它们仍然很容易。

首先让我们从区分纯字符串的部分开始。

package com.devchronicles.observer;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.inject.Qualifier;/**** @author Murat Yener*/
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD,ElementType.PARAMETER})
public @interface MyEvent {Type value();enum Type{LOGGING, MESSAGE} 
}

上面的接口将用作注释,以标记要触发的字符串,以后只需注释相应的部分即可观察到。

package com.devchronicles.observer;import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.enterprise.event.Event;
import javax.inject.Inject;/**** @author Murat Yener*/
@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class EventService {@Injectprivate String message;@Inject @MyEvent(MyEvent.Type.LOGGING)Event<String> event;@Inject @MyEvent(MyEvent.Type.MESSAGE)Event<String> anotherEvent;public void startService(){System.out.println("start service call "+message);event.fire("this is my "+message);System.out.println("done...");anotherEvent.fire("done with the service!");}
}

我们只添加具有所需类型的MyEvent批注,然后像以前一样触发事件。 标有红色的部分就是我们在上一篇文章中添加的示例。

现在让我们注释观察者部分。 同样,我们将在前面的示例中添加红色部分。

package com.devchronicles.observer;import javax.ejb.Stateless;
import javax.enterprise.event.Observes;/**** @author Murat Yener*/
@Stateless
public class EventObserver {public void doLogging(@Observes @MyEvent(MyEvent.Type.LOGGING) String message){System.out.println("Observed:"+message);}public void doLogging(@Observes @MyEvent(MyEvent.Type.MESSAGE) String message){System.out.println("Observed another type of message:"+message);}
}

那就是您甚至需要区分要观察的相同类型对象的全部。

参考: JavaEE重新审视设计模式:观察者 , JavaEE重新审视设计模式:观察器来自JCG合作伙伴 Murat Yener的Developer Chronicles博客上的第2部分 。


翻译自: https://www.javacodegeeks.com/2012/04/java-ee-revisits-design-patterns_17.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/372953.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

POI搜索简介

用户输入——用户输出-----------------------------------------------------------而POI搜索引擎&#xff0c;需要做的就是拿到输入条件&#xff0c;给出用户比较满意的结果。用户角度&#xff1a;输入&#xff1a;尽量简单&#xff0c;且符合心意输入时的假设&#xff1a;假…

2、Spring的 IoC详解(第一个Spring程序)

Spring是为了解决企业应用开发的复杂性而创建的一个轻量级的控制反转&#xff08;IoC&#xff09;和面向切面&#xff08;AOP&#xff09;的容器框架。在这句话中重点有两个&#xff0c;一个是IoC&#xff0c;另一个是AOP。今天我们讲第一个IoC。 一. IoC理论的背景 我们都知道…

排除服务器简单系统故障方法,引导CD排除服务器故障方法有哪些?

尽管Linux系统以稳定可靠著称&#xff0c;但由于硬件问题有时仍会崩溃/或无法引。针对这一问题&#xff0c;最好的解决办法就是使用Linux系统引导CD。为了方便读者&#xff0c;笔者在下面列出了安装Red Hat Linux 8。0的最必须步骤。为安装过程作笔记在Red Hat Linux系统典型安…

js 获取father_(原创)Node.JS实战26:强大的工作池。收藏吧!你一定会用的到。...

在实际项目中&#xff0c;如果遇到需要大计算量的操作&#xff0c;按需fork&#xff08;分叉&#xff09;其实不是一个好的选择。因为fork的子进程也是V8&#xff08;NodeJS的核心引擎&#xff09;的新实例&#xff0c;每创建一个新实例&#xff0c;需要约30毫秒启动时间&#…

具有ReadWriteLock的Java并发

编写多线程Java应用程序并不是小菜一碟。 必须格外小心&#xff0c;因为同步不良会使您的应用程序一s不振。 JVM堆由所有线程共享。 如果多个线程需要同时使用相同的对象或静态类变量&#xff0c;则必须谨慎管理对共享数据的线程访问。 从1.5版开始&#xff0c;JSDK中包含了在并…

修复steam服务器失败,steam服务器链接失败

steam服务器链接失败 内容精选换一换当NTP服务器异常时产生该告警。当NTP服务器异常消除时&#xff0c;该告警恢复。主OMS节点配置的NTP服务器异常&#xff0c;可能会导致主OMS节点与外部服务器不能同步时间&#xff0c;集群时间可能会产生飘移。NTP服务器网络异常。与NTP服务器…

qemu-kvm简单使用

qemu-kvm主要有以下几个选项: -snapshot: 创建快照-m: 指定内存大小-smp: 指定处理器个数-cpu: 指定CPU类型-name: 设置虚拟机名称-vnc: 使用vnc连接-boot: 指定启动相关的选项-net: 指定网卡相关的选项-drive: 指定硬盘/光盘相关的选项qemu-kvm -m 128 -name first -smp 2 -dr…

将jar添加到发布目录_第32批免购置税新能源车型目录发布;通用BEV3平台将入华...

1、第32批免购置税新能源车型目录发布&#xff0c;几何X/理想ONE等283款车型入选6月2日&#xff0c;工信部发布《免征车辆购置税的新能源汽车车型目录(第三十二批)》&#xff0c;共有283款新能源车型入选。其中新能源乘用车方面包括&#xff0c;一汽大众Q2L/e-BORA、东风风神E7…

HPROF –内存泄漏分析教程

本文将为您提供有关如何通过生成和分析Sun HotSpot JVM HPROF堆转储文件来分析JVM内存泄漏问题的教程。 一个现实的案例研究将用于此目的&#xff1a;Weblogic 9.2内存泄漏影响Weblogic Admin服务器。 环境规格 Java EE服务器&#xff1a;Oracle Weblogic Server 9.2 MP1 中…

mq服务器与客户端消息同步,使用 ActiveMQ 实现JMS 异步调用

目录简介服务之间的同步调用&#xff0c;可以使用 HTTP 或 RPC 来完成&#xff0c;但并非所有的调用都需要同步&#xff0c;有些场景下&#xff0c;当客户端调用服务端时&#xff0c;并不需要等待服务端做出响应&#xff0c;此时就应该使用异步调用。异步调用的常用方式是基于 …

多个数字数组_七个问题帮助初学者深入理解Java数组

短文涨姿势&#xff0c;看了不白看&#xff0c;不关注等啥&#xff1f;几乎所有的高级语言当中&#xff0c;都提供了一种叫做”数组”的东西&#xff0c;Java语言当然也不例外。我们通过数组可以很方便的存储和管理一组数据。因为在Java语言当中使用数组非常的方便&#xff0c;…

java 异常练习题1

建立exception包&#xff0c;建立Bank类&#xff0c;类中有变量double balance表示存款,Bank类的构造方法能增加存款&#xff0c;Bank类中有取款的发方法withDrawal(double dAmount),当取款的数额大于存款时,抛出InsufficientFundsException,取款数额为负数&#xff0c;抛出Nag…

大话设计模式读书笔记--6.原型模式

简单的复制粘贴极有可能造成重复代码的灾难, 但是java中提供了克隆的功能, 如果一个对象创建过程复杂,又要频繁使用, 在初始化信息不发生变化的情况下,应当采取克隆而不是new一个对象 定义 原型模式: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 也就是说,…

Java 7#8:测试台上的NIO.2文件通道

关于新JDK 7功能的另一篇博客文章。 这次我正在写有关新的AnsynchronousFileChannel类的文章。 我将在两周内深入分析新的JDK 7功能&#xff0c;并决定连续编号我的帖子。 只是为了确保我不会感到困惑&#xff1a;-)这是我关于Java 7的第七篇文章&#xff08;我承认–碰巧–这也…

5页面title样式修改_认识html:实现网站页面是这么简单的一回事

互联网时代人们通过上网浏览信息&#xff0c;打开浏览器上网看到丰富的图文、视频、音乐等多媒体信息&#xff0c;一系列信息反馈和视觉冲击之后&#xff0c;您有没有想过&#xff0c;互联网这么发达的时代&#xff0c;您觉得花一点点时间学会做个网站页面不真香&#xff1f;概…

iOS指南针

前言&#xff1a; 这个小项目使用到了CoreLocation框架里面的设备朝向功能&#xff0c;对CoreLocation感兴趣的可以翻一下之前的文章 在另一个博客站有朋友发现一个尴尬的问题&#xff08;图片的东西2个方向是不对的&#xff09;&#xff0c;原谅我的大意&#xff0c;赶时间就直…

OSGI –模块化您的应用程序

由于我是模块化&#xff0c;低耦合&#xff0c;高凝聚力等的大力拥护者&#xff0c;所以…… 我相信这项技术是我们使用Java平台创建应用程序的突破。 使用OSGi&#xff0c;创建高度可扩展的应用程序非常简单&#xff0c;例如参见Eclipse IDE。 我的目的不是要深入展示该技术的…

jq的链式调用.end();

jq的链式调用.end(); 先上code <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>li{list-style: none;width: 100px;height:20px;border:1px solid #ff0000;display: …

三、自定义视图、视图控制器

1.自定义视图 自定义视图&#xff1a;系统标准UI之外&#xff0c;自己组合而出的新的视图。在实际开发中&#xff0c;我们经常需要自己定义视图&#xff0c;积累自己的代码库。自己封装的视图&#xff0c;能像系统提供的UI控件一样用于多个项目中&#xff0c;这样可以提高我们的…

程序如何在两个gpu卡上并行运行_深度学习分布式训练相关介绍 - Part 1 多GPU训练...

本篇文章主要是对深度学习中运用多GPU进行训练的一些基本的知识点进行的一个梳理文章中的内容都是经过认真地分析&#xff0c;并且尽量做到有所考证抛砖引玉&#xff0c;希望可以给大家有更多的启发&#xff0c;并能有所收获介绍大多数时候&#xff0c;梯度下降算法的训练需要较…