定義
觀察者模式又稱爲發佈訂閱模式。
定義了一種一對多的依賴關係,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態發生變化時,會通知所有觀察者,使他們能夠自動更新自己。
場景舉例
微信公衆號訂閱。
具體實現
定義發佈者接口Observable
public interface Observable {
// 註冊觀察者
void registerObserver(Observer o);
// 刪除觀察者
void removeObserver(Observer o);
// 向所有觀察者發佈通知
void notifyObserver();
}
定義微信公衆號服務類實現了Observable接口
public class WeChatServer implements Observable {
private List<Observer> list = new ArrayList<>();
private String message;
// 註冊觀察者
@Override
public void registerObserver(Observer o) {
list.add(o);
}
// 刪除觀察者
@Override
public void removeObserver(Observer o) {
if (!list.isEmpty()) {
list.remove(o);
}
}
// 發佈消息給所有觀察者
@Override
public void notifyObserver() {
for (Observer observer : list) {
observer.update(message);
}
}
// 新消息發佈
public void publish(String s) {
this.message = s;
System.out.println("微信服務更新消息: " + s);
//消息更新,通知所有觀察者
notifyObserver();
}
}
定義觀察者接口
public interface Observer {
void update(String message);
}
定義用戶類User實現Observer
public class User implements Observer {
private String name;
public User(String name) {
this.name = name;
}
@Override
public void update(String message) {
System.out.println(name + " 收到推送消息: " + message);
}
}
測試類
public class Test {
public static void main(String[] args) {
// 創建發佈者
WeChatServer server = new WeChatServer();
// 創建觀察者
Observer u1 = new User("張三");
Observer u2 = new User("李四");
Observer u3 = new User("王二麻子");
// 註冊觀察者
server.registerObserver(u1);
server.registerObserver(u2);
server.registerObserver(u3);
// 發佈信息
server.publish("Java從入門到精通!");
System.out.println("----------------------------------------------");
// 移除觀察者
server.removeObserver(u1);
// 發佈信息
server.publish("Java從入門到入土!");
}
}
結果打印:
觀察者模式總結
當一個對象的改變需要同時改變其它對象,並且它不知道具體要改變多個對象的時候,應該考慮使用觀察者模式。
觀察者模式所做的工作就是解除觀察者與被觀察者之間的耦合。