察看者形式是一種行動型計劃形式,它容許東西間樹破一種一對多的依附關係。當一個東西的狀況產生變更時,全部依附於它的東西都會掉掉落告訴並主動更新。這種形式在Java編程中非常罕見,特別是在須要實現變亂處理、GUI編程跟消息行列等場景。
察看者形式的基本道理
察看者形式的核心頭腦是解耦,它將目標東西(Subject)跟察看者(Observer)之間的依附關係分別。目標東西擔任保護一個察看者列表,並在狀況改變時告訴全部察看者。察看者則只須要實現一個更新介面,當接收到告訴時,它會主動更新本人的狀況。
察看者形式的重要組件
- Subject(察看目標):保護一個察看者列表,並定義了註冊、刪除跟告訴察看者的方法。
- Observer(察看者):定義了一個更新介面,東西可能經由過程該介面接收到告訴。
- ConcreteSubject(具體目標):實現Subject介面,包含具體的狀況,並在狀況改變時告訴察看者。
- ConcreteObserver(具體察看者):實現Observer介面,根據接收到的告訴更新本人的狀況。
Java中的察看者形式實現
在Java中,察看者形式平日利用java.util.Observable
類跟java.util.Observer
介面來實現。以下是一個簡單的示例:
import java.util.ArrayList;
import java.util.Observable;
import java.util.Observer;
// 察看目標
class Subject extends Observable {
private int state;
public void setState(int state) {
this.state = state;
setChanged(); // 標記察看目標已變動
notifyObservers(); // 告訴全部察看者
}
public int getState() {
return state;
}
}
// 察看者
class ObserverA implements Observer {
private String name;
public ObserverA(String name) {
this.name = name;
}
@Override
public void update(Observable o, Object arg) {
System.out.println(name + " received: " + ((Subject) o).getState());
}
}
// 測試類
public class ObserverPatternDemo {
public static void main(String[] args) {
Subject subject = new Subject();
ObserverA observerA = new ObserverA("Observer A");
ObserverA observerB = new ObserverA("Observer B");
subject.addObserver(observerA);
subject.addObserver(observerB);
subject.setState(1);
subject.setState(2);
subject.setState(3);
}
}
在這個示例中,Subject
類實現了Observable
介面,並保護了一個狀況變數。當狀況產生變更時,它會告訴全部註冊的察看者。ObserverA
類實現了Observer
介面,並在update
方法中列印接收到的狀況。
察看者形式的長處跟毛病
長處
- 降落耦合度:察看者形式可能降落目標東西跟察看者之間的耦合度,使得它們可能獨破改變跟擴大年夜。
- 進步機動性:察看者形式容許靜態地增加跟刪除察看者,使得體系愈加機動。
- 進步擴大年夜性:當須要增加新的察看者時,不須要修改目標東西的代碼。
毛病
- 代碼關係不明顯:因為松耦合,偶然可能難以懂得代碼之間的關係。
- 效力成績:假如一個Subject被大年夜量Observer訂閱,播送告訴時可能會呈現效力成績。
總結
察看者形式是一種富強的計劃形式,它可能幫助我們在Java中實現東西間的靜態交互。經由過程懂得察看者形式的基本道理跟實現方法,我們可能更好地計劃可保護、可擴大年夜的軟體系統。