情景引入
在本章中,我们将要学习 Observer模式。
Observer的意思是“进行观察的人”,也就是“观察者”的意思。
在 Observer模式中,当观察对象的状态发生变化时,会通知给观察者。Observer模式适用于根据
对象状态进行相应处理的场景。
示例程序
功能描述
观察者将观察一个会生成数值的对象,并将它生成的数值结果显示出来。
类的一览表
名字 |
说明 |
Observer |
表示观察者的接口 |
NumberGenerator |
表示生成数值的对象的抽象类 |
RandomNumberGenerator |
生成随机数的类 |
DigitObserver |
表示以数字形式显示数值的类 |
GraphObserver |
表示以简单的图示形式显示数值的类 |
Main |
测试程序行为的类 |
UML

主要代码
Observer 类
1 2 3
| public interface Observer { void update(NumberGenerator generator); }
|
NumberGenerator 类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| public abstract class NumberGenerator { private ArrayList observers = new ArrayList(); public void addObserver(Observer observer){ observers.add(observer); } public void deleteObserver(Observer observer){ observers.remove(observer); } public void notifyObserver(){ Iterator it = observers.iterator(); while(it.hasNext()){ Observer o = (Observer) it.next(); o.update(this); } } public abstract int getNumber(); public abstract void execute(); }
|
RandomNumberGenerator 类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| public class RandomNumberGenerator extends NumberGenerator{ Random random = new Random(); private int number; @Override public int getNumber() { return number; }
@Override public void execute() { for (int i = 0; i < 20; i++) { number = random.nextInt(50); notifyObservers(); } } }
|
DigitObserver 类
1 2 3 4 5 6 7 8 9 10 11 12
| public class DigitObserver implements Observer {
@Override public void update(NumberGenerator generator) { System.out.println("DigitObserver : " + generator.getNumber()); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } }
|
GraphObserver 类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| public class GraphObserver implements Observer{ @Override public void update(NumberGenerator generator) { System.out.println("GraphObserver : "); int count = generator.getNumber(); for (int i = 0; i < count; i++) { System.out.print("*"); } System.out.println(""); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } }
|
Main 类
1 2 3 4 5 6 7 8 9 10
| public class Main { public static void main(String[] args) { RandomNumberGenerator generator = new RandomNumberGenerator(); Observer o1 = new DigitObserver(); Observer o2 = new GraphObserver(); generator.addObserver(o1); generator.addObserver(o2); generator.execute(); } }
|