Observer模式

情景引入

在本章中,我们将要学习 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();
}
}

Observer模式
http://lhystutest.top/2022/10/30/设计模式/Observer 模式/Observer模式/
作者
lhy
发布于
2022年10月30日
许可协议