1.观察者模式
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
2.模式中的角色
2.1 抽象主题(Subject):它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。(一般包括声明addobserver; removeoberver; notifyobserver;方法)
2.2 具体主题(ConcreteSubject):将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。(实现抽象主题的方法)
2.3 抽象观察者(Observer):为所有的具体观察者定义一个接口,在得到主题通知时更新自己。(一般包括声明update方法)
2.4 具体观察者(ConcreteObserver):实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调。
例:
(1)public interface Watched {
//抽象主题
public void addWatcher(Watcher watcher);
public void removeWatch(Watcher watcher);
public void notifyWatcher(String str);
}
(2)//具体主题 import java.util.ArrayList; import java.util.List; public class ConcreteWatched implements Watched { private List<Watcher>list = new ArrayList<Watcher>(); public void addWatcher(Watcher watcher) { // TODO Auto-generated method stub list.add(watcher); } public void removeWatch(Watcher watcher) { // TODO Auto-generated method stub list.remove(watcher); } public void notifyWatcher(String str) { // TODO Auto-generated method stub for(Watcher watcher : list){ watcher.update(str); } } }
(3)//抽象观察者
public interface Watcher { public void update(String str); }
(4)//具体观察者
(5)//测试public class ConcreteWatcher implements Watcher { public void update(String str) { // TODO Auto-generated method stub System.out.println(str); } }
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.notifyWatcher("开心"); girl.removeWatch(watcher1); girl.notifyWatcher("不开心"); } }
3.观察者模式实现小程序
使用java自带库实现:被观察者对象继承Observable以及观察者实现Observer接口
例:有一个 int 类型的变量,初始值为 10,编写一个 for 循环,将该数字每次递减 1,一直到 0 为止,每次变化时,都将该数字传递给它的观察者,观察者会打印出该数字;第二个观察者在该数字变为 5 之后开始打印该数字。
import java.util.Observable; import java.util.Observer; public class TwoObserver { //测试类 public static void main(String[] args) { watched wd = new watched(); watcher1 w1 = new watcher1(); watcher2 w2 = new watcher2(); wd.addObserver(w1); wd.addObserver(w2); //通过改变被观察对象,进而通知观察者自动更新 wd.count(10); } }
//被观察对象 class watched extends Observable{ public void count(int num){ for(;num >= 0 ;num--){ this.setChanged(); this.notifyObservers(num); } } }
class watcher1 implements Observer{//第一个观察者
public void update(Observable o, Object arg) {
// TODO Auto-generated method stub
System.out.println("watcher1 num is:"+arg);
}
}
//第二个观察者 class watcher2 implements Observer{
public void update(Observable o, Object arg) {
// TODO Auto-generated method stub
if(((Integer)arg).intValue() <= 5){
System.out.println("watcher2 num is:"+arg);
}
}
}
结果:
watcher1 num is:10
参考:
张龙老师javaSE视频