使用场景:
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();
}
}