觀察者模式(Observer),定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態發生變化時,會通知所有觀察者對象,使它們能夠自動更新自己。
觀察者模式又叫發布-訂閱(Publish/Subscribe)模式。
觀察者模式主要涉及4個部分:
- 抽象主題:它把所有觀察者對象的引用保存到一個聚集里,每個主題都可以有任何數量的觀察者。抽象主題提供一個接口,可以增加和通知觀察者對象。
- 具體主題:將有關狀態存入具體觀察者對象;在具體主題內部狀態改變時,給所有登記過的觀察者發出通知。
- 抽象觀察者:為所有的具體觀察者定義一個接口,在得到主題通知時更新自己。
- 具體觀察者:實現抽象觀察者角色所要求的更新接口,以便使本身的狀態與主題狀態協調。
公交車上有很多乘客,公交到站了會廣播播報站點名稱,乘客在相應站點下車。在這里,我們把乘客作為抽象觀察者,男乘客和女乘客是具體觀察者,把起到通知到站作用的通知者作為抽象主題,廣播承擔了具體主題的角色。
觀察者模式類圖
- 通知者
public abstract class Notifier {
private List<Passenger> passengerList = new ArrayList<Passenger>();
public void add(Passenger passenger) {
passengerList.add(passenger);
}
public void notifyPassenger() {
for (Passenger passenger : passengerList) {
passenger.getOffTheBus();
}
}
}
- 廣播
public class Broadcast extends Notifier {
private String stationName;
public String getStationName() {
return stationName;
}
public void setStationName(String stationName) {
this.stationName = stationName;
}
}
- 乘客
public interface Passenger {
void getOffTheBus();
}
- 女乘客
public class FemalePassenger implements Passenger {
private Broadcast broadcast;
public FemalePassenger(Broadcast broadcast) {
this.broadcast = broadcast;
}
@Override
public void getOffTheBus() {
System.out.println("female passenger get off the bus, station name is " + broadcast.getStationName());
}
}
- 男乘客
public class MalePassenger implements Passenger {
private Broadcast broadcast;
public MalePassenger(Broadcast broadcast) {
this.broadcast = broadcast;
}
@Override
public void getOffTheBus() {
System.out.println("male passenger get off the bus, station name is " + broadcast.getStationName());
}
}
- 客戶端測試類
public class Client {
public static void main(String[] args) {
Broadcast broadcast = new Broadcast();
FemalePassenger femalePassenger = new FemalePassenger(broadcast);
MalePassenger malePassenger = new MalePassenger(broadcast);
broadcast.add(femalePassenger);
broadcast.add(malePassenger);
broadcast.setStationName("Zhong Shan park");
broadcast.notifyPassenger();
}
}
運行結果:
female passenger get off the bus, station name is Zhong Shan park
male passenger get off the bus, station name is Zhong Shan park
觀察者模式主要解決的是一個對象狀態的改變給其他對象通知的問題。一個對象(主題對象)的狀態發生改變,所有的依賴對象(觀察者對象)都將得到通知,進行廣播通知。