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.pswp.cn/news/372953.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372953.shtml
英文地址,請注明出處:http://en.pswp.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;梯度下降算法的訓練需要較…