一、觀察者模式Java
觀察者模式也稱為發布-訂閱模式,它是一種行為型設計模式,可實現對象之間的松耦合。在觀察者模式中,一個對象(主題)維護著一系列依賴於它(觀察者)的對象,當狀態發生改變時,主題會通知所有觀察者自動進行更新。
public interface Observer { void update(); } public interface Subject { void registerObserver(Observer observer); void removeObserver(Observer observer); void notifyObservers(); } public class ConcreteSubject implements Subject { private List observers = new ArrayList(); private int state; public void setState(int state) { this.state = state; notifyObservers(); } public void registerObserver(Observer observer) { observers.add(observer); } public void removeObserver(Observer observer) { observers.remove(observer); } public void notifyObservers() { for (Observer observer : observers) { observer.update(); } } } public class ConcreteObserver implements Observer { private ConcreteSubject subject; public ConcreteObserver(ConcreteSubject subject) { this.subject = subject; subject.registerObserver(this); } public void update() { //do something } } public class Client { public static void main(String[] args) { ConcreteSubject subject = new ConcreteSubject(); ConcreteObserver observer1 = new ConcreteObserver(subject); ConcreteObserver observer2 = new ConcreteObserver(subject); ConcreteObserver observer3 = new ConcreteObserver(subject); subject.setState(1); } }
在上述代碼中,Observable介面是觀察者所需要實現的介面。Subject介面是主題所需要實現的介面。具體主題(ConcreteSubject)實現了Subject介面,並維護了一個觀察者列表。具體觀察者(ConcreteObserver)實現了Observer介面。
二、觀察者模式多對多
在觀察者模式中,主題和觀察者是一對多的關係,但是在實際應用中,有時候需要支持多對多的關係。
這時候需要在Subject介面中新增方法,讓觀察者可以取消訂閱,同時在具體觀察者中也可以新增註冊、註銷方法。
public interface Observer { void update(); void subscribe(Subject subject); void unsubscribe(Subject subject); } public interface Subject { void registerObserver(Observer observer); void removeObserver(Observer observer); void notifyObservers(); void registerSubject(Observer observer); void removeSubject(Observer observer); } public class ConcreteSubject implements Subject { private List observers = new ArrayList(); private List subjects = new ArrayList(); private int state; public void setState(int state) { this.state = state; notifyObservers(); } public void registerObserver(Observer observer) { observers.add(observer); } public void removeObserver(Observer observer) { observers.remove(observer); } public void notifyObservers() { for (Observer observer : observers) { observer.update(); } } public void registerSubject(Observer observer) { subjects.add(observer); } public void removeSubject(Observer observer) { subjects.remove(observer); } } public class ConcreteObserver implements Observer { private ConcreteSubject subject; public void subscribe(Subject subject) { subject.registerSubject(this); } public void unsubscribe(Subject subject) { subject.removeSubject(this); } } public class Client { public static void main(String[] args) { ConcreteSubject subject1 = new ConcreteSubject(); ConcreteSubject subject2 = new ConcreteSubject(); ConcreteObserver observer1 = new ConcreteObserver(); ConcreteObserver observer2 = new ConcreteObserver(); observer1.subscribe(subject1); observer1.subscribe(subject2); observer2.subscribe(subject1); } }
三、觀察者模式和狀態模式的區別
觀察者模式和狀態模式都是行為型模式,但它們的目的和結構是不同的。觀察者模式是用於對象間的通知,當一個對象的狀態發生變化時,它的所有依賴對象都會得到通知,並自動更新。而狀態模式是為了讓對象在不同情況下可以改變它的行為,實現狀態與行為的分離。
觀察者模式由主題和觀察者組成,主題維護一個觀察者列表,當狀態發生改變時通知觀察者。狀態模式由狀態、上下文和行為組成,行為的結果取決於上下文狀態的改變。
四、觀察者模式類圖
觀察者模式的類圖如下:
五、觀察者模式應用場景
觀察者模式適用於以下場景:
- 當一個對象的改變必須要通知其他對象,並且不能假定那些對象是誰。
- 當一個對象需要確保其他對象與之保持一致性時,如資料庫的一部分改變,需要通知其他部分進行更新操作。
- 當一個對象改變時需要改變其他對象。
- 當一個對象的改變需要其他對象反過來改變時,如遊戲中的人物狀態變化,會影響其他人物的狀態。
六、觀察者模式適用於
觀察者模式適用於Java中的Swing庫中的Model-View-Controller(MVC)模式,當Model的狀態發生改變時,View會自動得到通知進行更新。
七、觀察者模式的實現
觀察者模式的實現需要注意以下幾點:
- 主題和觀察者之間的耦合度,需要注意避免循環依賴。
- 代碼實現需要考慮線程安全問題。
八、觀察者模式觀察者太多
當觀察者過多時,會影響性能。解決方案可以是採取緩存機制,只更新最近使用的觀察者。
九、觀察者模式優缺點
觀察者模式的優點:
- 分離了主題和觀察者的耦合,主題只需要知道觀察者實現了Observer介面即可,而不需要知道具體實現。
- 主題可以通知多個觀察者進行更新,實現了松耦合。
- 可以動態地添加和刪除觀察者。
觀察者模式的缺點:
- 觀察者過多時,會影響性能。
- 觀察者並不知道彼此的存在,容易導致程序出錯。
十、小結
觀察者模式Java是一種非常有用的設計模式,在Java中有廣泛的應用。通過觀察者模式,可以避免對象之間的耦合度,實現松耦合,增加程序的靈活性和可擴展性。在使用觀察者模式時,需要注意避免循環依賴和線程安全問題。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/271443.html