java观察者设计模式_Java中的观察者设计模式
java觀察者設計模式
在本教程中,我們將討論Observer設計模式。
觀察者模式有兩個主要方面- 主題和觀察者 。 當我們的系統有多個對象(稱為觀察者)時 ,將使用一個模式,即依賴于一個特定對象( 主體)的狀態 。 所有觀察者都將自己注冊為主題。 每當主題狀態發生變化時,所有這些觀察者都會得到通知。
使用此觀察者模式的一個真實示例是博客訂閱。 如果您訂閱自己喜歡的博客,則它會在有任何更新時立即收到通知。
這樣,讓我們??深入研究概念。
UML表示形式:
我們可以用以下UML表示觀察者設計模式:
我們在哪里:
- 主題:維護觀察者列表,提供注冊/注銷觀察者的方法。 另外,具有notifyAll()方法可將所有狀態更改通知所有注冊的觀察者
- SubjectImpl:擴展Subject類功能的類,它保存一個表示其當前狀態的狀態對象。 請注意, 最好有一個不可變的狀態對象,以防止觀察者進行任何無意的更新
- 觀察者:這是一個帶有update()方法的接口,由Subject調用以將其當前狀態的任何更改通知觀察者
- ConcreteObserver:這些是實現Observer接口的類,觀察者對象注冊自己以偵聽Subject
博客訂閱示例:
假設我們要在發布新帖子時通知我們的博客訂閱者。 讓我們使用觀察者模式實現它。
為此,我們首先定義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類標記為抽象的原因是我們希望Subject具有至少某種狀態。
現在我們已經實現了Subject超類,讓我們編寫Blog類:
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擴展而來,并在post ()方法內調用notifyAll()方法,以在文章發布后立即通知所有訂閱者。
實施觀察者:
現在讓我們定義我們的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()方法訂閱博客。 用戶訂閱博客后,他/她將自動收到發布的所有新帖子的更新。
測試我們的實施:
讓我們快速測試一下我們的代碼:
//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);執行上面的代碼后,我們將得到如下輸出:
<span><br /> James,新帖子發表:Composite Design Pattern…<br /> Selena,新帖子發表: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 ...結論:
在本快速教程中,我們學習了如何實現Observer設計模式。 此設計模式用于實現發布者-訂閱者JMS模型。 另外, 類似java.util.EventListener和javax.servlet.http.HttpSessionAttributeListener的類都使用此模式。
而且,很高興知道Java提供了觀察者的基本實現以及分別名為java.util.Observer和java.util.Observable的主題類。
翻譯自: https://www.javacodegeeks.com/2019/09/observer-design-pattern-in-java-3.html
java觀察者設計模式
總結
以上是生活随笔為你收集整理的java观察者设计模式_Java中的观察者设计模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微软前首席产品官帕奈将出任亚马逊设备和服
- 下一篇: java美元兑换,(Java实现) 美元