觀察者模式:定義了對(duì)象之間的一對(duì)多依賴(lài)赌髓,這樣一來(lái)祝钢,當(dāng)一個(gè)對(duì)象改變狀態(tài)時(shí),它的所有依賴(lài)者都會(huì)收到通知并自動(dòng)更新吱窝。
觀察者提供了一種對(duì)象設(shè)計(jì)讥邻,讓對(duì)象和觀察者之間松耦合。
實(shí)例
以微信用戶(hù)訂閱微信公眾號(hào)為例罩驻,當(dāng)微信公眾號(hào)更新后背桐,就會(huì)通知訂閱該公眾號(hào)的用戶(hù)思灌。此時(shí),用戶(hù)就是觀察者发魄,而公眾號(hào)就是被觀察者。
觀察者,也就是用戶(hù)
public interface Observer {
void update(String msg);
}
public class User implements Observer {
private String name;
public User(String name){
this.name = name;
}
@Override
public void update(String msg) {
System.out.println("name="+name+" msg="+msg);
}
}
被觀察者励幼,也就是公眾號(hào)
public interface Observable {
void register(Observer observer);
void unregister(Observer observer);
void notifyObservers(String msg);
}
import java.util.ArrayList;
import java.util.List;
public class WechatSubject implements Observable
{
List<Observer> observerList = new ArrayList<>();
@Override
public void register(Observer observer) {
observerList.add(observer);
}
@Override
public void unregister(Observer observer) {
observerList.remove(observer);
}
@Override
public void notifyObservers(String msg) {
for (Observer observer :observerList) {
observer.update(msg);
}
}
}
測(cè)試代碼
public class Test {
public static void main(String[] args) {
User user1 = new User("jack");
User user2 = new User("Cat");
WechatSubject subject = new WechatSubject();
subject.register(user1);
subject.register(user2);
subject.notifyObservers("公眾號(hào)更新了");
}
}
輸出
name=jack msg=公眾號(hào)更新了
name=Cat msg=公眾號(hào)更新了