被观察者
所有被观察者都继承Observable接口 ( java标准库中Observable是一个抽象类)
1 2 3 4 5
| interface Observable{ public void addObserver(Observer observer); public void deleteObserver(Observer observer); public void notifyObserver(String context); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| class AA implements Observable,IHanFeiZi_3{ private ArrayList<Observer> observerList=new ArrayList<Observer>();
@Override public void addObserver(Observer observer) { observerList.add(observer); }
@Override public void deleteObserver(Observer observer) { this.observerList.remove(observer); }
@Override public void notifyObserver(String context) { for(Observer observer:observerList){ observer.update(context); } }
@Override public void method1() { ... }
@Override public void method2() { ... } }
|
观察者
所有的观察者都继承Observer接口
1 2 3
| interface Observer{ public void update(String str); }
|
1 2 3 4 5 6
| class BB implements Observer{ @Override public void update(String context) { ... } }
|
场景
1 2 3 4 5 6 7 8 9 10 11 12
| public static void main(String[] args){ Observer a1=new AA_1(); Observer a2=new AA_2(); Observer a3=new AA_1(); BB bb=new BB();
bb.addObserver(a1); bb.addObserver(a2); bb.addObserver(a3);
bb.method1(); }
|
观察者模式的注意事项
- 需要注意效率问题
- 由于消息通知是顺序执行的, 如有需要, 可采用异步方式
- 消息不能无限制的传递下去, 一般而言, 在一个观察者模式中最多出现一个对象既是被观察者又是观察者. 否则程序的维护性会变得很差.