被观察者

所有被观察者都继承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{
//存放observer
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();
}

观察者模式的注意事项

  1. 需要注意效率问题
  2. 由于消息通知是顺序执行的, 如有需要, 可采用异步方式
  3. 消息不能无限制的传递下去, 一般而言, 在一个观察者模式中最多出现一个对象既是被观察者又是观察者. 否则程序的维护性会变得很差.