1.抽象主题角色(接口或者抽象类)
/**
* 抽象主题角色
* 主题角色把所有的观察者对象的引用保存在一个列表里;
* 每个主题都可以有任何数量的观察者。
* 主题提供一个接口可以加上或撤销观察者对象;主题角色又叫做抽象被观察者(Observable)角色
*/
public interface Watched {
public void addWatcher(Watcher watch);
public void removeWatcher(Watcher watch);
public void notifyWatchers(String str);
}
2. 抽象观察者(Observer)角色 (为所有的具体观察者定义一个接口,在得到通知时更新自己)
//抽象观察者
public interface Watcher {
public void update(String str);
}
3.具体主题(ConcreteSubject)角色
/**
* 具体主题(ConcreteSubject)角色:
* 保存对具体观察者对象有用的内部状态;
* 在这种内部状态改变时给其观察者发出一个通知;
* 具体主题角色又叫作具体被观察者角色;
* @author gulijiang
*/
public class ConcreteWatched implements Watched {
private List<Watcher> list = new ArrayList<Watcher>();
@Override
public void addWatcher(Watcher watch) {
list.add(watch);
}
@Override
public void removeWatcher(Watcher watch) {
list.remove(watch);
}
@Override
public void notifyWatchers(String str) {
for (Watcher watcher : list) {
watcher.update(str);
}
}
}
4. 具体观察者(ConcreteObserver)角色
public class ConcreteWatcher implements Watcher {
@Override
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("开心");
girl.removeWatcher(watcher2);
girl.notifyWatchers("不开心");
}
}