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)//具体观察者public class ConcreteWatcher implements Watcher {
public void update(String str) {
// TODO Auto-generated method stub
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.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视频