观察者模式
关键点:
1、针对观察者与被观察者分别定义接口,有利于分别进行扩展。
2、重点就在被观察者的实现中:
(1)定义观察者集合,并定义针对集合的添加、删除操作,用于增加、删除订阅者(观察者)
(2)定义通知方法,用于将新情况通知给观察者用户(订阅者用户)
3、观察者中需要有个接收被观察者通知的方法。
1.抽象主题角色,watched被观察
public interface Watched {
public void addWatcher(Watcher watcher);
public void removeWatcher(Watcher watcher);
public void notifyWatchers(String str);
}
2.抽象观察角色
public interface Watcher {
public void update(String str);
}
3.具体的被观察者
public class ConcreteWatched implements Watched {
//1.需要存储观察者
private List<Watcher> list = new ArrayList<Watcher>();
//2.新增观察者
public void addWatcher(Watcher watcher) {
list.add(watcher);
}
//3.删除观察者
public void removeWatcher(Watcher watcher) {
list.remove(watcher);
}
//4.调用观察者的方法来通知观察者
public void notifyWatchers(String str) {
for(Watcher watcher:list){
watcher.update(str);
}
}
}
4.具体的观察者
public class ConcreteWatcher implements Watcher {
public void update(String str) {
System.out.println(str);
}
}
5.测试客户端
public class Test {
public static void main(String[] args) {
Watched girl = new ConcreteWatched();
Watcher watcher1 = new ConcreteWatcher();
Watcher watcher2 = new ConcreteWatcher();
Watcher watcher3 = new ConcreteWatcher();
girl.addWatcher(watcher1);
girl.addWatcher(watcher2);
girl.addWatcher(watcher3);
girl.notifyWatchers("update");
}
}
本问的实现较为简单,比较通用的实现方式为观察者和被观察者都有多个实现,
可参考下面这篇博文