定义
The Observer pattern defines a one-to-many dependency between objects so that when one changes state, all of its dependents are notified and updated automatically.
观察者模式定义了对象之间的一对多的依赖关系,这样当一个对象的状态发生改变时,依赖它的那些对象将会被通知到,会自动更新自己的状态.
说明
观察者(Observer)模式又名发布-订阅(Publish/Subscribe)模式。做软件开发的经常会订阅邮件列表,这其实也是一种观察者(Observer)模式。Java的API提供了对这一模式的原生支持,为我们提供了Observer接口和Observable类来实现所谓观察者模式。
图示
使用Java内置的模式
主题类
1import java.util.Observable;
2
3/**
4 * 观察者模式学习 (主题类)
5 *
6 * @author sunwei
7 *
8 */
9public class MyObservable extends Observable
10{
11 public void setName(String name)
12 {
13 setChanged();
14 notifyObservers();
15 }
16}
17
2
3/**
4 * 观察者模式学习 (主题类)
5 *
6 * @author sunwei
7 *
8 */
9public class MyObservable extends Observable
10{
11 public void setName(String name)
12 {
13 setChanged();
14 notifyObservers();
15 }
16}
17
观察者类1
1 package com.ztgame.pattern;
2
3 import java.util.Observable;
4 import java.util.Observer;
5 /**
6 * 观察者1
7 *
8 * @author sunwei
9 *
10 */
11 public class Observer1 implements Observer
12 {
13 @Override
14 public void update(Observable o, Object arg)
15 {
16 System.out.println("我是观察者1,我收到了我订阅的主题!");
17 }
18 }
2
3 import java.util.Observable;
4 import java.util.Observer;
5 /**
6 * 观察者1
7 *
8 * @author sunwei
9 *
10 */
11 public class Observer1 implements Observer
12 {
13 @Override
14 public void update(Observable o, Object arg)
15 {
16 System.out.println("我是观察者1,我收到了我订阅的主题!");
17 }
18 }
观察者类2
1 package com.ztgame.pattern;
2
3 import java.util.Observable;
4 import java.util.Observer;
5 /**
6 * 观察者2
7 *
8 * @author sunwei
9 *
10 */
11 public class Observer2 implements Observer
12 {
13 @Override
14 public void update(Observable o, Object arg)
15 {
16 System.out.println("我是观察者2,我也收到了主题信息!");
17 }
18 }
2
3 import java.util.Observable;
4 import java.util.Observer;
5 /**
6 * 观察者2
7 *
8 * @author sunwei
9 *
10 */
11 public class Observer2 implements Observer
12 {
13 @Override
14 public void update(Observable o, Object arg)
15 {
16 System.out.println("我是观察者2,我也收到了主题信息!");
17 }
18 }
组织协调类
1 public class LearnOb
2 {
3 public static void main(String[] args)
4 {
5 // 主题,被观察者
6 MyObservable observable = new MyObservable();
7 observable.addObserver(new Observer1());
8 observable.addObserver(new Observer2());
9 observable.setName("changed");
10 }
11 }
2 {
3 public static void main(String[] args)
4 {
5 // 主题,被观察者
6 MyObservable observable = new MyObservable();
7 observable.addObserver(new Observer1());
8 observable.addObserver(new Observer2());
9 observable.setName("changed");
10 }
11 }