Java设计模式(十五)观察者模式(Observer)

介绍

包括这个模式在内的接下来的四个模式,都是类和类之间的关系,不涉及到继承。观察者模式很好理解,类似于邮件订阅和RSS订阅,当我们浏览一些博客或wiki时,经常会看到RSS图标,就这的意思是,当你订阅了该文章,如果后续有更新,会及时通知你。其实,简单来讲就一句话:当一个对象变化时,其它依赖该对象的对象都会收到通知,并且随着变化!

1
2
3
4
public interface Observer {
/*用于更新观察者本身的属性或执行某些行为*/
public void update();
}

两个实现类

1
2
3
4
5
6
7
public class Observer1 implements Observer {
@Override
public void update() {
System.out.println("observer1 has received!");
}
}

1
2
3
4
5
6
7
8
public class Observer2 implements Observer {
@Override
public void update() {
System.out.println("observer2 has received!");
}
}

Subject接口及实现类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public interface Subject {
/*增加观察者*/
public void add(Observer observer);
/*删除观察者*/
public void del(Observer observer);
/*通知所有的观察者*/
public void notifyObservers();
/*自身的操作*/
public void operation();
}

抽象类实现接口的一些通用操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public abstract class AbstractSubject implements Subject {
private Vector<Observer> vector = new Vector<Observer>();
@Override
public void add(Observer observer) {
vector.add(observer);
}
@Override
public void del(Observer observer) {
vector.remove(observer);
}
/*通知所有观察者,调用观察者的更新方法*/
@Override
public void notifyObservers() {
Enumeration<Observer> enumo = vector.elements();
while(enumo.hasMoreElements()){
enumo.nextElement().update();
}
}
}

实现类继承抽象类实现接口的具体区别的操作

1
2
3
4
5
6
7
8
9
public class MySubject extends AbstractSubject {
@Override
public void operation() {
System.out.println("update self!");
notifyObservers();
}
}

测试类

1
2
3
4
5
6
7
8
9
10
11
public class ObserverTest {
public static void main(String[] args) {
Subject sub = new MySubject();
sub.add(new Observer1());
sub.add(new Observer2());
sub.operation();
}
}