Java中的观察者设计模式
在本教程中,我們將討論Observer設(shè)計模式。
觀察者模式有兩個主要方面- 主題和觀察者 。 當(dāng)我們的系統(tǒng)有多個對象(稱為觀察者)時 ,將使用一個模式,該對象依賴于一個特定對象( 主體)的狀態(tài) 。 所有觀察者都將自己注冊為主題。 每當(dāng)主題狀態(tài)發(fā)生變化時,所有這些觀察者都會得到通知。
使用此觀察者模式的一個真實示例是博客訂閱。 如果您訂閱自己喜歡的博客,則它會在有任何更新時收到通知。
這樣,讓我們??深入研究概念。
UML表示形式:
我們可以使用以下UML表示觀察者設(shè)計模式:
我們在哪里:
- 主題:維護(hù)觀察者列表,提供注冊/注銷觀察者的方法。 另外,具有notifyAll()方法可將所有狀態(tài)更改通知所有注冊的觀察者
- SubjectImpl:擴(kuò)展Subject類功能的類,它保存一個表示其當(dāng)前狀態(tài)的狀態(tài)對象。 請注意, 最好有一個不可變的狀態(tài)對象,以防止觀察者進(jìn)行任何無意的更新
- 觀察者:這是一個帶有update()方法的接口,由Subject調(diào)用以通知觀察者當(dāng)前狀態(tài)的任何變化
- ConcreteObserver:這些是實現(xiàn)Observer接口的類,觀察者對象注冊自己以偵聽Subject
博客訂閱示例:
假設(shè)我們要在發(fā)布新帖子時通知我們的博客訂閱者。 讓我們使用觀察者模式實現(xiàn)它。
為此,我們首先定義Subject類:
public abstract class Subject { ????private List<Observer> observers = new ArrayList<>(); ????public void register(Observer observer) { this .observers.add(observer); } ????public void unregister(Observer observer) { if ( this .observers.contains(observer)) { this .observers.remove(observer); } } ?public void notifyAll() { for (Observer o : observers) { o.update(); } } }我們將Subject類標(biāo)記為抽象的原因是我們希望Subject具有至少某種狀態(tài)。
現(xiàn)在我們已經(jīng)實現(xiàn)了Subject超類,讓我們編寫B(tài)log類:
public class Blog extends Subject { ?private String title; private String author; ????public Blog(String title, String author) { this .title = title; this .author = author; } ?public void publish(Post post) { //code to publish a new post ... notifyAll(); } ?public Post getRecentPost() { ... } ?... }我們的Blog類從Subject擴(kuò)展而來,并在post ()方法內(nèi)調(diào)用notifyAll()方法,以在文章發(fā)布后立即通知所有訂閱者。
實施觀察者:
現(xiàn)在讓我們定義Observer接口和Subscriber類:
public interface Observer { ?void update(); } ? public class Subscriber implements Observer { ?private String name; private Subject subject; ?public Subscriber(String name) { this .name = name; } ????public void subscribeTo(Subject subject) { subject.register( this ); this .subject = subject; } ????public void unsubscribeFrom(Subject subject) { subject.unregister( this ); this .subject = null ; } ?@Override public void update() { if ( this .subject == null ) { System.out.println( "Not yet subscribed!" ); return ; } //get the last published post Post recentPost = this .subject.getRecentPost(); System.out.println( this .name + ", a new post got published: " + recentPost); } }請注意,博客訂閱者將使用subscribeTo()方法訂閱博客。 用戶訂閱博客后,他/她將自動收到發(fā)布的所有新帖子的更新。
測試我們的實施:
讓我們快速測試一下我們的代碼:
//in the main method Subject programmerGirlBlog = new Blog( "ProgrammerGirl" , "Shubhra" ); ? Observer james = new Subscriber( "James" ); Observer selena = new Subscriber( "Selena" ); ? james.subscribeTo(programmerGirlBlog); selena.subscribeTo(programmerGirlBlog); ? Post compositeDesignPattern = new Post( "Composite Design Pattern" ); ? programmerGirlBlog.publish(compositeDesignPattern);執(zhí)行上面的代碼后,我們將獲得類似以下的輸出:
<span><br /> James,新帖子發(fā)表:Composite Design Pattern…<br /> Selena,新帖子發(fā)表:Composite Design Pattern…</span>
James, a post got published: Composite Design Pattern ... new post got published: Composite Design Pattern ... Selena, a post got published: Composite Design Pattern ... new post got published: Composite Design Pattern ...結(jié)論:
在本快速教程中,我們學(xué)習(xí)了如何實現(xiàn)Observer設(shè)計模式。 此設(shè)計模式用于實現(xiàn)發(fā)布者-訂閱者JMS模型。 此外, 類似java.util.EventListener和javax.servlet.http.HttpSessionAttributeListener的類都使用此模式。
此外,很高興知道Java提供了觀察者的基本實現(xiàn)以及分別名為java.util.Observer和java.util.Observable的主題類。
翻譯自: https://www.javacodegeeks.com/2019/09/observer-design-pattern-in-java-3.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的Java中的观察者设计模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 简单的ddos攻击指令(简单的ddos攻
- 下一篇: 嘉兴购房备案流程(嘉兴购房备案)
