一、概述bash
觀察者模式是一種對象行爲型模式,定義了一對多的依賴關係,讓多個觀察者對象同時監聽某個主題對象。這個主題對象會通知全部的觀察者對象,使他們自動更新本身。 它關鍵對象是觀察目標和觀察者,每一個觀察者都將即時更新本身的狀態,以與目標狀態同步,這種交互也稱爲發佈-訂閱(publishsubscribe)。目標是通知的發佈者,它發出通知時並不須要知道誰是它的觀察者,能夠有任意數目的觀察者訂閱它並接收通知。異步
二、模式結構 ide
觀察者涉及角色:測試
三、使用場景ui
四、優缺點this
優勢:spa
缺點:線程
五、實例日誌
首先定義被觀察者code
public interface Subject {
public void attach(Observer obj);
public void detach(Observer obj);
public void notifyObserver(String topicName);
}
複製代碼
在建立一個關聯的觀察者
public interface Observer {
public void update(String topicName);
}
複製代碼
關聯已經創建,如今實現具體的主題
public class Topic implements Subject {
private List<Observer> list;
public Topic() {
list = new ArrayList<>();
}
@Override
public void attach(Observer obj) {
if (obj == null) {
return;
}
if (!list.contains(obj)) {
list.add(obj);
}
}
@Override
public void detach(Observer obj) {
if (list.contains(obj)) {
list.remove(obj);
}
}
@Override
public void notifyObserver(String topicName) {
for (Observer observer : list) {
observer.update(topicName);
}
}
}
複製代碼
具體觀察者的實現,他們將一直關注subject對象。
public class TopicSubscriber implements Observer {
private String name;
public TopicSubscriber(String name) {
this.name = name;
}
@Override
public void update(String topicName) {
System.out.println(name + " topic name update:" + topicName);
}
}
複製代碼
測試,定義三個具體的觀察者,而後註銷一個觀察者。
public void testTopic() {
Topic topic = new Topic();
TopicSubscriber sub1 = new TopicSubscriber("sub1");
TopicSubscriber sub2 = new TopicSubscriber("sub2");
TopicSubscriber sub3 = new TopicSubscriber("sub3");
topic.attach(sub1);
topic.attach(sub2);
topic.attach(sub3);
topic.notifyObserver("new topic1");
topic.detach(sub3);
topic.notifyObserver("new topic2");
}
打印日誌
sub1 topic name update:new topic1
sub2 topic name update:new topic1
sub3 topic name update:new topic1
sub1 topic name update:new topic2
sub2 topic name update:new topic2
複製代碼