城鄉(xiāng)建設(shè)網(wǎng)站報(bào)建需要什么網(wǎng)絡(luò)產(chǎn)品及其推廣方法
目錄
1、簡(jiǎn)介
2、組成部分
3、優(yōu)缺點(diǎn)
4、使用場(chǎng)景
5、代碼實(shí)現(xiàn)
1、簡(jiǎn)介
觀察者模式是一種軟件設(shè)計(jì)模式,它定義了一種一對(duì)多的依賴關(guān)系,讓多個(gè)觀察者對(duì)象同時(shí)監(jiān)聽(tīng)一個(gè)主題對(duì)象,當(dāng)主題對(duì)象發(fā)生變化時(shí),所有的觀察者對(duì)象都會(huì)得到通知并且自動(dòng)更新。
2、組成部分
觀察者模式中的三個(gè)核心角色包括:
- 主題(Subject):被觀察的對(duì)象,通常會(huì)維護(hù)一個(gè)觀察者列表,以便在狀態(tài)發(fā)生變化時(shí)通知觀察者。
- 觀察者(Observer):觀察主題對(duì)象的狀態(tài)變化,當(dāng)主題狀態(tài)發(fā)生變化時(shí),觀察者將得到通知并執(zhí)行相應(yīng)的操作。
- 具體主題(ConcreteSubject):具體的主題實(shí)現(xiàn)類,負(fù)責(zé)維護(hù)一個(gè)觀察者列表,并實(shí)現(xiàn)主題對(duì)象狀態(tài)變化的通知邏輯。
- 具體觀察者(ConcreteObserver):具體的觀察者實(shí)現(xiàn)類,實(shí)現(xiàn)觀察者接口,并定義觀察者接收到通知后的具體操作。
3、優(yōu)缺點(diǎn)
觀察者模式的優(yōu)點(diǎn)包括:
- 降低對(duì)象之間的耦合性:主題對(duì)象和觀察者對(duì)象之間的關(guān)系是松散的,它們之間并沒(méi)有直接依賴關(guān)系,使得它們之間的交互變得靈活和可擴(kuò)展。
- 符合“開(kāi)閉原則”:當(dāng)需要增加新的觀察者對(duì)象時(shí),不需要修改主題對(duì)象的代碼,只需要增加一個(gè)新的具體觀察者即可。
- 支持廣播通信:主題對(duì)象可以同時(shí)通知多個(gè)觀察者對(duì)象,使得多個(gè)觀察者對(duì)象可以同時(shí)對(duì)主題對(duì)象的狀態(tài)變化進(jìn)行響應(yīng)。
觀察者模式的缺點(diǎn)包括:
- 觀察者數(shù)量過(guò)多會(huì)導(dǎo)致性能問(wèn)題:如果觀察者數(shù)量過(guò)多,每次狀態(tài)變化都需要通知所有的觀察者對(duì)象,會(huì)導(dǎo)致性能問(wèn)題。
- 觀察者與主題的依賴關(guān)系可能會(huì)導(dǎo)致循環(huán)引用:觀察者對(duì)象和主題對(duì)象之間是相互依賴的,如果設(shè)計(jì)不當(dāng)可能會(huì)導(dǎo)致循環(huán)引用問(wèn)題。
- 可能會(huì)出現(xiàn)狀態(tài)不一致問(wèn)題:如果觀察者對(duì)象在收到通知后執(zhí)行的操作與主題對(duì)象的狀態(tài)更新操作不同步,可能會(huì)導(dǎo)致觀察者對(duì)象的狀態(tài)與主題對(duì)象的狀態(tài)不一致。
- 觀察者對(duì)象接收到的通知是有序的:通知的順序可能會(huì)影響觀察者對(duì)象的執(zhí)行結(jié)果,如果觀察者對(duì)象之間有相互依賴關(guān)系,可能會(huì)影響整個(gè)系統(tǒng)的正確性。
- 觀察者模式可能會(huì)導(dǎo)致性能問(wèn)題題:如果主題對(duì)象在通知觀察者對(duì)象時(shí),需要執(zhí)行較為復(fù)雜的操作,可能會(huì)影響整個(gè)系統(tǒng)的性能。
總體來(lái)說(shuō),觀察者模式是一種很有用的設(shè)計(jì)模式,它可以實(shí)現(xiàn)對(duì)象之間的松耦合,提高代碼的可維護(hù)性和可擴(kuò)展性。但是在使用時(shí)需要注意上述缺點(diǎn),并結(jié)合具體的業(yè)務(wù)場(chǎng)景進(jìn)行選擇。
4、使用場(chǎng)景
觀察者模式的使用場(chǎng)景包括:
- 一個(gè)對(duì)象的狀態(tài)變化會(huì)影響其他對(duì)象:當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生變化時(shí),其他多個(gè)對(duì)象需要做出相應(yīng)的響應(yīng),此時(shí)可以使用觀察者模式。
- 對(duì)象的狀態(tài)更新頻繁且多個(gè)對(duì)象需要及時(shí)更新:如果一個(gè)對(duì)象的狀態(tài)更新非常頻繁,多個(gè)對(duì)象需要及時(shí)更新?tīng)顟B(tài),那么使用觀察者模式可以提高程序的效率。
- 對(duì)象需要在不同的情況下通知不同的觀察者對(duì)象:當(dāng)對(duì)象需要在不同的情況下通知不同的觀察者對(duì)象時(shí),可以使用觀察者模式。這種情況下,每個(gè)觀察者對(duì)象只需要關(guān)注它所感興趣的通知即可。
- 想要實(shí)現(xiàn)事件監(jiān)聽(tīng)器:當(dāng)需要在程序中實(shí)現(xiàn)事件監(jiān)聽(tīng)器時(shí),可以使用觀察者模式。例如,在Java中,可以使用Swing框架中的觀察者模式來(lái)實(shí)現(xiàn)圖形界面組件的事件監(jiān)聽(tīng)器。
- MVC模式中的視圖與模型:在MVC(Model-View-Controller)模式中,視圖層需要對(duì)模型層進(jìn)行監(jiān)聽(tīng),當(dāng)模型層發(fā)生變化時(shí),視圖層需要及時(shí)更新自己的顯示。此時(shí)可以使用觀察者模式,將視圖層作為觀察者對(duì)象,將模型層作為主題對(duì)象。
總之,當(dāng)需要在多個(gè)對(duì)象之間實(shí)現(xiàn)松耦合的消息傳遞時(shí),可以考慮使用觀察者模式。觀察者模式適用于需要?jiǎng)討B(tài)更新的場(chǎng)景,可以幫助我們將代碼設(shè)計(jì)得更加靈活和可擴(kuò)展。
5、代碼實(shí)現(xiàn)
下面是一個(gè)使用Java實(shí)現(xiàn)觀察者模式的示例,并對(duì)代碼進(jìn)行詳細(xì)說(shuō)明:
1、首先定義主題接口Subject和觀察者接口Observer:
public interface Subject {void registerObserver(Observer observer);void removeObserver(Observer observer);void notifyObservers();
}
public interface Observer {void update(float temperature, float humidity, float pressure);
}
2、定義具體的主題類WeatherData,實(shí)現(xiàn)Subject接口:?
import java.util.ArrayList;public class WeatherData implements Subject {private ArrayList<Observer> observers;private float temperature;private float humidity;private float pressure;public WeatherData() {observers = new ArrayList<>();}public void registerObserver(Observer observer) {observers.add(observer);}public void removeObserver(Observer observer) {int index = observers.indexOf(observer);if (index >= 0) {observers.remove(index);}}public void notifyObservers() {for (Observer observer : observers) {observer.update(temperature, humidity, pressure);}}public void measurementsChanged() {notifyObservers();}public void setMeasurements(float temperature, float humidity, float pressure) {this.temperature = temperature;this.humidity = humidity;this.pressure = pressure;measurementsChanged();}
}
3、定義具體的觀察者類CurrentConditionsDisplay,實(shí)現(xiàn)Observer接口:?
public class CurrentConditionsDisplay implements Observer {private float temperature;private float humidity;private float pressure;private Subject weatherData;public CurrentConditionsDisplay(Subject weatherData) {this.weatherData = weatherData;weatherData.registerObserver(this);}public void update(float temperature, float humidity, float pressure) {this.temperature = temperature;this.humidity = humidity;this.pressure = pressure;display();}public void display() {System.out.println("Current conditions: " + temperature + "F degrees and " + humidity + "% humidity");}
}
4、編寫(xiě)測(cè)試代碼:?
public class WeatherStation {public static void main(String[] args) {WeatherData weatherData = new WeatherData();CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay(weatherData);weatherData.setMeasurements(80, 65, 30.4f);weatherData.setMeasurements(82, 70, 29.2f);weatherData.setMeasurements(78, 90, 29.2f);}
}
運(yùn)行以上代碼,輸出結(jié)果如下:
????????Current conditions: 80.0F degrees and 65.0% humidity
????????Current conditions: 82.0F degrees and 70.0% humidity
????????Current conditions: 78.0F degrees and 90.0% humidity
以上代碼演示了觀察者模式的基本實(shí)現(xiàn),具體說(shuō)明如下:
- WeatherData類是主題類,它維護(hù)了一個(gè)觀察者列表,實(shí)現(xiàn)了Subject接口中的三個(gè)方法:registerObserver、removeObserver和notifyObservers,用來(lái)注冊(cè)觀察者、移除觀察者和通知觀察者。WeatherData類還定義了一個(gè)measurementsChanged方法,用來(lái)在氣象數(shù)據(jù)發(fā)生變化時(shí)通知觀察者。
- CurrentConditionsDisplay類是觀察者類,它實(shí)現(xiàn)了Observer接口中的update方法,用來(lái)更新觀測(cè)值,并調(diào)用display方法展示當(dāng)前觀測(cè)值。CurrentConditionsDisplay類還在構(gòu)造方法中注冊(cè)到主題類中,以便接收氣象數(shù)據(jù)的變化通知。
- WeatherStation類是測(cè)試類,創(chuàng)建了WeatherData和CurrentConditionsDisplay對(duì)象,并通過(guò)調(diào)用setMeasurements方法模擬氣象數(shù)據(jù)的變化,然后觀察當(dāng)前觀測(cè)值是否會(huì)被更新和顯示出來(lái)。
觀察者模式的實(shí)現(xiàn)可以讓主題類和觀察者類分離,使它們之間的依賴性降到最低,提高了代碼的靈活性和可擴(kuò)展性。當(dāng)主題對(duì)象發(fā)生變化時(shí),所有注冊(cè)的觀察者對(duì)象都會(huì)收到通知,可以進(jìn)行相應(yīng)的處理,實(shí)現(xiàn)了松耦合。
需要注意的是,觀察者模式也存在一些缺點(diǎn)。當(dāng)觀察者對(duì)象較多時(shí),主題對(duì)象的通知會(huì)導(dǎo)致較大的開(kāi)銷(xiāo);觀察者對(duì)象需要實(shí)現(xiàn)update方法,這可能會(huì)導(dǎo)致代碼的復(fù)雜性增加。因此,在使用觀察者模式時(shí)需要根據(jù)具體情況進(jìn)行權(quán)衡和選擇。