使用場景:
1、對一個對象的改動需要同時改動其他對象,但又不知道具體有多少對象
2、當一個抽象模型有兩個部分,其中一個部分依賴於另外一個部分,將兩個部分封裝到獨立的對象中以實現獨立的複用
3、當一個對象必須通知其他對象,但又不知道其他對象時誰
涉及到的有:
抽象觀察者:定義爲一個接口,其中可以有任意數量的觀察者。可以添加、刪除抽象觀察者
抽象被觀察者:定義爲一個接口
具體觀察者:實現抽象觀察者接口,得到消息時通知自己。
具體被觀察者:實現抽象被觀察者接口。
抽象被觀察者:
public interface Watched {
void addWatcher(Wather wather);
void remove(Wather wather);
void notifyWatchers();
}
具體被觀察者:
eg:微信公衆號爲一個被觀察者,在微信公衆號中有新消息時,通知所有關注公衆號的微信用戶
public class WeChat implements Watched{
List<Wather> wathers = new ArrayList<Wather>();
public void addWatcher(Wather wather) {
wathers.add(wather);
}
public void remove(Wather wather) {
wathers.remove(wather);
}
public void notifyWatchers() {
for(Wather w :wathers){
w.update();
}
}
}
抽象觀察者:
public interface Wather {
void update();
}
具體觀察者:
eg:微信用戶,得到消息時候更新自己
public class WeChatUser implements Wather {
private String name;
public WeChatUser(String name){
this.name=name;
}
public void update() {
System.out.println(name+" 收到更新消息!");
}
}
測試類:
public class Test {
public static void main(String[] args){
WeChatUser user1 = new WeChatUser("遇見");
WeChatUser user2 = new WeChatUser("sg");
WeChat weChat = new WeChat();
weChat.addWatcher(user1);
weChat.addWatcher(user2);
weChat.notifyWatchers();
}
}