设计模式 (二) :观察者模式

定义:定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。

类型:行为类模式

观察者模式代码

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
public interface IObserver {
void update();
}
public class Observer1 implements IObserver{ //观察者
@Override
public void update() {
//观察者做出相应的反应
System.out.println("Observer1 has updated");
}
}
public class Observer2 implements IObserver { //观察者
@Override
public void update() {
//观察者做出相应的反应
System.out.println("Observer2 has updated");
}
}
abstract class Target {
private ArrayList<IObserver> obs = new ArrayList<>(); //创建一个观察者数组列表
public void addObserver(IObserver iObserver) {
//添加观察者
this.obs.add(iObserver);
}
public void delObserver(IObserver iObserver) {
this.obs.remove(iObserver);
}

public void notifyObserver() {
//通知观察者进行更新
for (IObserver o : obs) {
o.update();
}
}
public abstract void doSomething();
}
public class ConcreteTarget extends Target {
//被观察者
@Override
public void doSomething() {
System.out.println("Concrete is doing something");
this.notifyObserver();
}
}
public class Main {
public static void main(String args[]) {
Target target = new ConcreteTarget();
target.addObserver(new Observer1());
target.addObserver(new Observer2());
target.doSomething();
}
}

类图

observer

通过运行结果可以看到,我们只调用了Target的方法,但同时两个观察者的相关方法都被同时调用了。仔细看一下代码,其实很简单,无非就是在Target类中关联一下Observer类,并且在doSomething方法中遍历一下Observer的update方法就行了。

观察者模式的优点

观察者与被观察者之间是属于轻度的关联关系,并且是抽象耦合的,这样,对于两者来说都比较容易进行扩展。

观察者模式是一种常用的触发机制,它形成一条触发链,依次对各个观察者的方法进行处理。但同时,这也算是观察者模式一个缺点,由于是链式触发,当观察者比较多的时候,性能问题是比较令人担忧的。并且,在链式结构中,比较容易出现循环引用的错误,造成系统假死。