柚子快報激活碼778899分享:設(shè)計模式之觀察者模式
柚子快報激活碼778899分享:設(shè)計模式之觀察者模式
一、觀察者模式介紹
觀察者模式(Observer Pattern)是一種行為設(shè)計模式,它定義了一種一對多的依賴關(guān)系,讓多個觀察者對象同時監(jiān)聽某一個主題對象。這個主題對象在狀態(tài)上發(fā)生變化時,會通知所有觀察者對象,使它們能夠自動更新自己。
1、觀察者模式的結(jié)構(gòu)
觀察者模式類圖結(jié)構(gòu):
觀察者模式主要涉及以下角色:
Subject(主題):它把所有對觀察者對象的引用保存在一個聚集(比如ArrayList對象)里,每個主題都可以有任何數(shù)量的觀察者。抽象主題提供一個接口,可以增加和刪除觀察者對象,主題的狀態(tài)發(fā)生變化時會通知所有的觀察者對象。 Observer(觀察者):為所有的具體觀察者定義一個接口,在得到主題的通知時更新自己,這個接口叫做更新接口。 ConcreteSubject(具體主題):將有關(guān)狀態(tài)存入具體觀察者對象;在具體主題的內(nèi)部狀態(tài)改變時,給所有登記過的觀察者發(fā)出通知。 ConcreteObserver(具體觀察者):實現(xiàn)抽象觀察者角色所要求的更新接口,以便使本身的狀態(tài)與主題的狀態(tài)相協(xié)調(diào)。如果需要,具體觀察者角色可以保持一個指向具體主題對象的引用。
2、觀察者模式的應(yīng)用場景
當(dāng)一個對象的改變需要同時改變其他對象,而且它不知道具體有多少對象有待改變時。當(dāng)一個對象必須通知其他對象,而它又不能假定其他對象是誰。換言之,你不希望這些對象是緊密耦合的。
3、觀察者模式的優(yōu)點
觀察者模式可以實現(xiàn)表示層和數(shù)據(jù)邏輯層的分離,并定義了穩(wěn)定的消息更新傳遞機制,抽象了更新接口,使得可以有各種各樣不同的表示層作為具體觀察者角色。觀察者模式在觀察目標(biāo)和觀察者之間建立一個抽象的耦合。觀察者模式支持廣播通信。
4、觀察者模式的缺點
如果一個被觀察者對象有很多的直接和間接的觀察者的話,將所有的觀察者都通知到會花費很多時間。如果在觀察者和觀察目標(biāo)之間有循環(huán)依賴的話,觀察目標(biāo)會觸發(fā)它們之間進(jìn)行循環(huán)調(diào)用,可能導(dǎo)致系統(tǒng)崩潰。觀察者模式?jīng)]有相應(yīng)的機制讓觀察者知道所觀察的目標(biāo)對象是怎么發(fā)生變化的,而僅僅只是知道觀察目標(biāo)發(fā)生了變化。
觀察者模式是一種非常有用的設(shè)計模式,在軟件開發(fā)中有著廣泛的應(yīng)用,特別是在實現(xiàn)事件處理系統(tǒng)、數(shù)據(jù)監(jiān)控系統(tǒng)等方面。
現(xiàn)在隨著Kafka、RocketMq等消息中間件的應(yīng)用,觀察者的一些缺點也已經(jīng)被彌補,但是其設(shè)計思想,在一個JVM應(yīng)用內(nèi)的場景,還是非常有用的。
二、觀察者模式例子
下面是一個簡單的Java觀察者模式的例子,包括一個主題(Subject)和兩個觀察者(Observer1?和?Observer2)。當(dāng)主題的狀態(tài)發(fā)生變化時,所有注冊的觀察者都會收到通知并更新自己的狀態(tài)。
import java.util.ArrayList;
import java.util.List;
// 觀察者接口
interface Observer {
void update(String message);
}
// 具體觀察者1
class Observer1 implements Observer {
public void update(String message) {
System.out.println("Observer1 received: " + message);
}
}
// 具體觀察者2
class Observer2 implements Observer {
public void update(String message) {
System.out.println("Observer2 received: " + message);
}
}
// 主題
class Subject {
private List
private String message;
public void attach(Observer observer) {
observers.add(observer);
}
public void detach(Observer observer) {
observers.remove(observer);
}
public void notifyUpdate(String message) {
this.message = message;
for (Observer observer : observers) {
observer.update(message);
}
}
}
// 測試類
public class ObserverPatternDemo {
public static void main(String[] args) {
Subject subject = new Subject();
Observer observer1 = new Observer1();
Observer observer2 = new Observer2();
subject.attach(observer1);
subject.attach(observer2);
subject.notifyUpdate("Hello Observers!");
subject.detach(observer1);
subject.notifyUpdate("Second message!");
}
}
在這個例子中,Subject?類維護(hù)了一個觀察者列表,并提供了?attach?和?detach?方法來添加和移除觀察者。notifyUpdate?方法用于通知所有注冊的觀察者主題的狀態(tài)已經(jīng)改變。
Observer1?和?Observer2?類實現(xiàn)了?Observer?接口,該接口定義了一個?update?方法,用于接收主題狀態(tài)變化的通知。
在?ObserverPatternDemo?測試類中,創(chuàng)建了一個?Subject?對象和兩個觀察者對象,并將這兩個觀察者注冊到主題上。然后,通過調(diào)用?notifyUpdate?方法來改變主題的狀態(tài),并觀察輸出結(jié)果。最后,移除了一個觀察者并再次發(fā)送通知,以演示觀察者可以從主題中注銷。
核心要點:subject主題負(fù)責(zé)維護(hù)好觀察者列表,在發(fā)生事件時,通知所有的觀察者,還是非常簡單的一個模式。
如果覺得對你有用,記得點贊 加 關(guān)注。
柚子快報激活碼778899分享:設(shè)計模式之觀察者模式
精彩文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。