做我女朋友網(wǎng)站免費發(fā)帖推廣平臺有哪些
設計模式專欄:http://t.csdnimg.cn/U54zu
目錄
一、引言
?核心概念
?應用場景
?可以解決的問題
二、場景案例
2.1 不用設計模式實現(xiàn)
2.2 存在問題
2.3 使用設計模式實現(xiàn)
2.4 成功克服
三、工作原理
3.1 結構圖和說明
3.2?工作原理詳解
3.3 實現(xiàn)步驟
四、 優(yōu)勢
4.1 好處和優(yōu)勢
4.2 應用示例
4.3 系統(tǒng)性優(yōu)勢
五、局限性和注意事項
5.1?局限性與不適用的場景
5.2?實際應用中的注意事項與建議
一、引言
?核心概念
? ??優(yōu)雅方案
? ??觀察者模式的核心概念主要包含以下幾個關鍵部分: ?1.?主題(Subject):
?2.?觀察者(Observer):
?3.?具體主題(Concrete Subject):
?4.?具體觀察者(Concrete Observer):
?5.?狀態(tài)(State):
?6.?更新接口(Update Method):
|
? 簡單而言
? ??觀察者模式允許對象之間建立一種一對多的依賴關系,當一個對象改變狀態(tài)時,所有依賴它的對象都會得到通知并且自動更新。這種通知機制使得對象之間的通信更加松散耦合、靈活可擴展。無需直接相互引用,各個對象能夠獨立變化而互不影響。通過觀察者模式,我們能夠輕松實現(xiàn)實時更新、動態(tài)同步等功能,從而為我們的應用帶來更好的用戶體驗和可維護性。無論是構建響應式界面、事件驅動系統(tǒng),還是實現(xiàn)即時通信、發(fā)布-訂閱模式,觀察者模式都是一個不可或缺的設計選擇。 |
? ? 接下來,讓我們深入探索觀察者模式的內部工作原理和實際應用案例,享受軟件開發(fā)的樂趣吧!?
?應用場景
? 觀察者模式在軟件設計中的應用場景
?1.?用戶界面(UI)交互:
?2.?事件監(jiān)測系統(tǒng):
?3.?發(fā)布/訂閱系統(tǒng):
?4.?數(shù)據(jù)模型與視圖同步:
|
?可以解決的問題
? ??在現(xiàn)代軟件開發(fā)中,組件間的交互和狀態(tài)同步是一項常見而又至關重要的挑戰(zhàn)。隨著業(yè)務邏輯的復雜化及用戶需求的不斷變化,如何設計出靈活、低耦合的系統(tǒng)成為軟件工程師面臨的一大課題。對于系統(tǒng)中存在的一個實體狀態(tài)改變需要通知到一個或多個依賴該狀態(tài)的實體的場景,如何高效率地處理這種狀態(tài)同步與通知呢?傳統(tǒng)的緊耦合聯(lián)系很難應對系統(tǒng)的迅速變化和擴展,而觀察者模式在此場景下應運而生,提供了一種優(yōu)雅且實用的設計解決方案。 |
? 使用觀察者模式可以解決的問題包括但不限于
|
????????
二、場景案例
?經(jīng)典場景:新聞發(fā)布系統(tǒng)
? ??最經(jīng)典的觀察者模式場景之一是“新聞發(fā)布系統(tǒng)”。在這個場景中,有多個訂閱者(觀察者)對新聞感興趣,他們希望在有新聞發(fā)布時能夠立即得到通知。系統(tǒng)管理員(主題)負責發(fā)布新聞。 |
2.1 不用設計模式實現(xiàn)
?一坨坨代碼實現(xiàn)
import java.util.ArrayList;
import java.util.List; // 新聞類
class News { private String content; public News(String content) { this.content = content; } public String getContent() { return content; }
} // 新聞發(fā)布器
class NewsPublisher { private List<NewsSubscriber> subscribers = new ArrayList<>(); // 訂閱新聞 public void subscribe(NewsSubscriber subscriber) { subscribers.add(subscriber); } // 取消訂閱 public void unsubscribe(NewsSubscriber subscriber) { subscribers.remove(subscriber); } // 發(fā)布新聞 public void publish(News news) { for (NewsSubscriber subscriber : subscribers) { subscriber.receiveNews(news); } }
} // 新聞訂閱者接口
interface NewsSubscriber { void receiveNews(News news);
} // 網(wǎng)頁新聞訂閱者
class WebNewsSubscriber implements NewsSubscriber { @Override public void receiveNews(News news) { System.out.println("WebNewsSubscriber: News received - " + news.getContent()); }
} // 郵件新聞訂閱者
class EmailNewsSubscriber implements NewsSubscriber { @Override public void receiveNews(News news) { System.out.println("EmailNewsSubscriber: News received - " + news.getContent()); }
} // 客戶端代碼
public class NewsSystemClient { public static void main(String[] args) { NewsPublisher publisher = new NewsPublisher(); NewsSubscriber webSubscriber = new WebNewsSubscriber(); NewsSubscriber emailSubscriber = new EmailNewsSubscriber(); publisher.subscribe(webSubscriber); publisher.subscribe(emailSubscriber); News news = new News("Breaking News: World Peace Achieved!"); publisher.publish(news); }
}
? ? 在這個實現(xiàn)中,NewsPublisher
?類充當了新聞發(fā)布的中心角色,它維護了一個訂閱者列表。當有新聞發(fā)布時,NewsPublisher
?會遍歷訂閱者列表,并調用每個訂閱者的?receiveNews
?方法來傳遞新聞。?
2.2 存在問題
? ??上述不使用設計模式實現(xiàn)的新聞發(fā)布系統(tǒng)確實存在一些問題,盡管它能夠實現(xiàn)基本的新聞發(fā)布和接收功能。以下還是存在如緊耦合、缺乏靈活性、可擴展性差、錯誤處理不足、缺乏抽象層次?和 動態(tài)性受限?等問題。 |
2.3 使用設計模式實現(xiàn)
?1. 觀察者接口(Observer):定義一個更新方法,當新聞發(fā)布時,所有觀察者都將調用此方法。
public interface Observer { void update(String news);
}
?2.?具體觀察者(ConcreteObserver):實現(xiàn)觀察者接口,當有新聞發(fā)布時,執(zhí)行具體的操作。例如,將新聞顯示在網(wǎng)頁上、發(fā)送到用戶的電子郵箱等。
public class WebObserver implements Observer { @Override public void update(String news) { System.out.println("WebObserver: Display news on website - " + news); }
} public class EmailObserver implements Observer { @Override public void update(String news) { System.out.println("EmailObserver: Send news to email - " + news); }
}
?3.?主題接口(Subject):定義一個注冊觀察者、移除觀察者和通知觀察者的方法。
import java.util.ArrayList;
import java.util.List; public interface Subject { void registerObserver(Observer observer); void removeObserver(Observer observer); void notifyObservers(String news);
}
?4.?具體主題(ConcreteSubject):實現(xiàn)主題接口,維護一個觀察者列表,并在有新聞發(fā)布時通知所有觀察者。
public class NewsSubject implements Subject { private List<Observer> observers = new ArrayList<>(); @Override public void registerObserver(Observer observer) { observers.add(observer); } @Override public void removeObserver(Observer observer) { observers.remove(observer); } @Override public void notifyObservers(String news) { for (Observer observer : observers) { observer.update(news); } }
}
?5.?客戶端代碼(Client):創(chuàng)建主題和觀察者對象,并將觀察者注冊到主題上。當有新聞發(fā)布時,主題會通知所有觀察者。
public class Client { public static void main(String[] args) { NewsSubject newsSubject = new NewsSubject(); Observer webObserver = new WebObserver(); Observer emailObserver = new EmailObserver(); newsSubject.registerObserver(webObserver); newsSubject.registerObserver(emailObserver); newsSubject.notifyObservers("Breaking News: World Peace Achieved!"); }
}
? ? 在這個場景中,新聞發(fā)布系統(tǒng)(主題)負責發(fā)布新聞,而網(wǎng)頁觀察者(WebObserver)和電子郵件觀察者(EmailObserver)則負責在新聞發(fā)布時顯示和發(fā)送新聞。通過使用觀察者模式,系統(tǒng)管理員可以輕松地添加或移除觀察者,而無需修改主題代碼。此外,當有新聞發(fā)布時,所有觀察者都會自動收到通知并更新,從而實現(xiàn)了松耦合和可擴展性。?
2.4 成功克服
? ??使用觀察者模式在上述示例中成功克服了多個問題,這些問題在使用直接的方法調用和對象間顯式交互時可能會出現(xiàn)。以下是觀察者模式成功克服的問題:
?1.?緊耦合:
?2.?缺乏靈活性:
?3.?可擴展性差:
?4.?錯誤處理不足:
?5.?缺乏抽象層次:
?6.?動態(tài)性受限:
|
????????
三、工作原理
3.1 結構圖和說明
- Subject:目標對象,通常具有如下功能。
- Observer:定義觀察者的接又,提供目標通知時對應的更新方法,這個更新方法進行相應的業(yè)務處理,可以在這個方法里面回調目標對象,以獲取目標對象的數(shù)據(jù)。
-
ConcreteSubject:具體的目標實現(xiàn)對象,用來維護目標狀態(tài),當目標對象的狀態(tài)發(fā)生改變時,通知所有注冊的、有效的觀察者,讓觀察者執(zhí)行相應的處理
-
ConcreteObserver:觀察者的具體實現(xiàn)對象,用來接收目標的通知,并進行相應的后續(xù)處理,比如更新自身的狀態(tài)以保持和目標的相應狀態(tài)一致。
3.2?工作原理詳解
?1.?注冊與訂閱:
?2.?狀態(tài)變化:
?3.?通知更新:
?4.?解耦:
?5.?靈活性和擴展性:
|
3.3 實現(xiàn)步驟
? ??使用觀察者模式實現(xiàn)功能時,你可以按照以下思考步驟進行:
?1.?定義主題和觀察者之間的關系:
?2.?設計通用接口:
?3.?實現(xiàn)注冊與移除觀察者功能:
?4.?定義通知機制:
?5.?更新觀察者狀態(tài):
?6.?考慮線程安全與性能問題:
?7.?實現(xiàn)解耦:
?8.?處理異常與錯誤:
?9.?測試:
?10.?細節(jié)優(yōu)化:
|
? ? ?在應用觀察者模式時,始終需要關注設計的整體清晰度、靈活性以及擴展性,確保最終實現(xiàn)的模式適合應用的上下文環(huán)境。
????????
四、 優(yōu)勢
4.1 好處和優(yōu)勢
? ??使用觀察者模式可以帶來以下明顯的好處和優(yōu)勢:
?1.?解耦:
?2.?靈活性:
?3.?動態(tài)響應:
?4.?簡化通信:
|
4.2 應用示例
? ? 考慮一個電商平臺上的商品定價系統(tǒng)。傳統(tǒng)的設計方法可能會要求每個依賴商品價格信息的組件都直接從價格數(shù)據(jù)庫中獲取更新。隨著系統(tǒng)的發(fā)展,這種緊耦合的方式導致了若干問題:每當價格更新邏輯變化時,所有依賴組件都需要作出相應修改;系統(tǒng)的可擴展性差,添加新的依賴組件會帶來額外的維護負擔。 |
? ? 采用觀察者模式改進后,價格系統(tǒng)作為主題,各個依賴組件(如庫存管理、促銷引擎、前端顯示等)作為觀察者。當商品價格更新時,價格系統(tǒng)僅需通知這些觀察者。這樣,庫存管理系統(tǒng)可以自動調整庫存采購策略,促銷引擎可以同步更新促銷活動,用戶界面也可以即時顯示最新價格。這種方式不僅使得價格更新流程更加清晰,而且讓各組件能夠更加獨立地開發(fā)和維護。 |
4.3 系統(tǒng)性優(yōu)勢
? ??觀察者模式通過解耦觀察者和被觀察者之間的關系,提高了系統(tǒng)的靈活性、擴展性和可維護性。具體來說:
?1.?靈活性:
?2.?擴展性:
?3.?可維護性:
|
? ? 綜上所述,觀察者模式通過解耦觀察者和被觀察者之間的關系,提高了系統(tǒng)的靈活性、擴展性和可維護性。它簡化了對象之間的通信和協(xié)作,使得代碼更加清晰、簡潔和易于維護。因此,在現(xiàn)代軟件開發(fā)中,觀察者模式被廣泛應用于處理不同組件之間的高效通信和動態(tài)響應問題。?
????????
五、局限性和注意事項
5.1?局限性與不適用的場景
? ??盡管觀察者模式為軟件開發(fā)帶來了許多好處,但在某些情況下,它也可能存在局限性和不適用的場景:
?1.?復雜的依賴關系:
?2.?性能考慮:
?3.?循環(huán)依賴:
?4.?錯誤處理:
|
5.2?實際應用中的注意事項與建議
?1.?推送 vs 拉取:
?2.?通知順序:
?3.?通知效率:
?4.?循環(huán)依賴:
?5.?內存管理:
?6.?異常處理:
?7.?狀態(tài)一致性:
?8.?設計模式的組合使用:
|
? ??在遵守這些注意事項和建議的同時,應該記住設計模式不是萬能的,不應該強行適配模式。在選擇應用觀察者模式前,確保它適合當前的問題場景,并充分考慮它可能帶來的設計復雜性。