成都市建設(shè)局官網(wǎng)seo優(yōu)化方式包括
???????????????????????????????????????????????????????????????????????????????????????💧 觀察者模式 \color{#FF1493}{觀察者模式} 觀察者模式💧 ?????????
🌷 仰望天空,妳我亦是行人.?
🦄 個人主頁——微風(fēng)撞見云的博客🎐
🐳 《數(shù)據(jù)結(jié)構(gòu)與算法》專欄的文章圖文并茂🦕生動形象🦖簡單易學(xué)!歡迎大家來踩踩~🌺
💧 《Java學(xué)習(xí)筆記》專欄的文章是本人在Java學(xué)習(xí)中總結(jié)的一些知識點(diǎn)~ 💐
🥣 《每天一點(diǎn)小知識》專欄的文章可以豐富你的知識庫,滴水成河~ 🌊
🪁 希望本文能夠給讀者帶來一定的幫助~🌸文章粗淺,敬請批評指正!🐥
文章目錄
- 🐳設(shè)計(jì)模式之觀察者模式
- 引言
- 觀察者模式的概念和思想
- 應(yīng)用場景
- 實(shí)現(xiàn)方式
- 使用接口
- 使用 Java 內(nèi)置的觀察者模式
- 使用觀察者模式
- 總結(jié)
- 🐳結(jié)語
🐳設(shè)計(jì)模式之觀察者模式
引言
設(shè)計(jì)模式是軟件開發(fā)中重要的概念之一。觀察者模式是設(shè)計(jì)模式中的一種,它用于定義對象之間的一對多依賴關(guān)系,當(dāng)一個對象的狀態(tài)發(fā)生改變時,其所有依賴者都會得到通知并自動更新。在本文中,我們將深入探討觀察者模式的概念和思想,并介紹觀察者模式的應(yīng)用場景以及常見的代碼實(shí)現(xiàn)方式。
觀察者模式的概念和思想
??💧觀察者模式是一種行為型設(shè)計(jì)模式,它建立了一種對象之間的依賴關(guān)系,當(dāng)一個對象的狀態(tài)發(fā)生改變時,其所有依賴者都會得到通知并自動更新。
??💧觀察者模式的核心思想是將觀察者和被觀察者解耦,使得它們可以獨(dú)立變化。被觀察者維護(hù)一個觀察者列表,并提供注冊、注銷和通知觀察者的方法。觀察者通過注冊到被觀察者上,實(shí)現(xiàn)對被觀察者狀態(tài)變化的監(jiān)聽。
觀察者模式的應(yīng)用場景以及常見的代碼實(shí)現(xiàn)方式 ↓
應(yīng)用場景
??💧觀察者模式通常在以下場景中使用:
- 當(dāng)一個對象的狀態(tài)變化
需要通知其他對象
,并且不希望與被通知的對象之間產(chǎn)生緊耦合關(guān)系
時。 - 當(dāng)一個對象的改變
需要同時改變其他對象
,并且不知道有多少對象需要改變
時。 - 當(dāng)一個對象
需要將自己的改變通知給一組對象
時。
實(shí)現(xiàn)方式
??💧觀察者模式有多種實(shí)現(xiàn)方式,其中最常見的方式包括使用接口
和使用 Java 內(nèi)置的觀察者模式
實(shí)現(xiàn)。
使用接口
??💧首先,我們定義一個被觀察者接口 Subject
和一個觀察者接口 Observer
:
public interface Subject {void registerObserver(Observer observer);void unregisterObserver(Observer observer);void notifyObservers();
}public interface Observer {void update();
}
在上述代碼中,Subject
接口定義了注冊觀察者、注銷觀察者和通知觀察者的方法。Observer
接口定義了觀察者的 update()
方法,用于接收被觀察者的通知。
??💧接下來,我們實(shí)現(xiàn)具體的被觀察者類 ConcreteSubject
和 ConcreteObserver
public class ConcreteSubject implements Subject {private List<Observer> observers = new ArrayList<>();private int state;public void registerObserver(Observer observer) {observers.add(observer);}public void unregisterObserver(Observer observer) {observers.remove(observer);}public void notifyObservers() {for (Observer observer : observers) {observer.update();}}public int getState() {return state;}public void setState(int state) {this.state = state;notifyObservers();}
}public class ConcreteObserver implements Observer {private Subject subject;public ConcreteObserver(Subject subject) {this.subject = subject;subject.registerObserver(this);}public void update() {int state = subject.getState();// 處理被觀察者狀態(tài)變化的邏輯}
}
在上述代碼中,ConcreteSubject
類實(shí)現(xiàn)了 Subject
接口,它維護(hù)了一個觀察者列表并實(shí)現(xiàn)了注冊、注銷和通知觀察者的方法。當(dāng) ConcreteSubject
的狀態(tài)發(fā)生變化時,它會調(diào)用 notifyObservers()
方法通知所有觀察者。
ConcreteObserver
類實(shí)現(xiàn)了 Observer
接口,它在構(gòu)造函數(shù)中注冊到被觀察者上,并實(shí)現(xiàn)了 update()
方法來處理被觀察者狀態(tài)變化的邏輯。
使用 Java 內(nèi)置的觀察者模式
??💧Java 提供了內(nèi)置的觀察者模式實(shí)現(xiàn),可以通過 java.util.Observable
類和 java.util.Observer
接口來實(shí)現(xiàn)觀察者模式。
import java.util.Observable;
import java.util.Observer;public class ConcreteSubject extends Observable {private int state;public int getState() {return state;}public void setState(int state) {this.state = state;setChanged();notifyObservers();}
}public class ConcreteObserver implements Observer {public void update(Observable o, Object arg) {int state = ((ConcreteSubject) o).getState();// 處理被觀察者狀態(tài)變化的邏輯}
}
在上述代碼中,ConcreteSubject
類繼承自 java.util.Observable
類,并使用 setChanged()
方法標(biāo)記狀態(tài)變化,然后調(diào)用 notifyObservers()
方法通知觀察者。
ConcreteObserver
類實(shí)現(xiàn)了 java.util.Observer
接口,它的 update()
方法會在被觀察者狀態(tài)變化時被調(diào)用。
使用觀察者模式
??💧以下是觀察者模式的使用示例:
public class Client {public static void main(String[] args) {ConcreteSubject subject = new ConcreteSubject();ConcreteObserver observer1 = new ConcreteObserver(subject);ConcreteObserver observer2 = new ConcreteObserver(subject);subject.setState(1);// 輸出:處理被觀察者狀態(tài)變化的邏輯// 輸出:處理被觀察者狀態(tài)變化的邏輯}
}
在上述代碼中,我們創(chuàng)建了一個具體的被觀察者對象 ConcreteSubject
和兩個具體的觀察者對象 ConcreteObserver
。通過將觀察者注冊到被觀察者上,當(dāng)被觀察者狀態(tài)發(fā)生變化時,觀察者的 update()
方法會被調(diào)用。
總結(jié)
????觀察者模式是一種有用的設(shè)計(jì)模式,它能夠?qū)崿F(xiàn)對象之間的一對多依賴關(guān)系,當(dāng)一個對象的狀態(tài)發(fā)生改變時,其所有依賴者都會得到通知并自動更新。通過觀察者模式,我們可以實(shí)現(xiàn)松耦合的對象間通信,提高代碼的靈活性和可維護(hù)性。
🐳結(jié)語
🐬初學(xué)一門技術(shù)時,總有些許的疑惑,別怕,它們是我們學(xué)習(xí)路上的點(diǎn)點(diǎn)繁星,幫助我們不斷成長。
🐟積少成多,滴水成河。文章粗淺,希望對大家有幫助!