JavaObserver模式
本文最后更新于:1 年前
发送状态变化通知
1 - 表示观察者的接口
public interface Observer {
public abstract void update(NumberGenerator generator);
}
2 - 表示生成数值的对象的抽象类
public abstract class NumberGenerator {
private ArrayList observers = new ArrayList(); // 保存Observer们
public void addObserver(Observer observer) { // 注册Observer
observers.add(observer);
}
public void deleteObserver(Observer observer) { // 删除Observer
observers.remove(observer);
}
public void notifyObservers() { // 向Observer发送通知
for (Object value : observers) {
Observer o = (Observer) value;
o.update(this);
}
}
public abstract int getNumber(); // 获取数值
public abstract void execute(); // 生成数值
}
3 - 表示生成随机数的类
public class RandomNumberGenerator extends NumberGenerator{
private 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();
}
}
}
4 - 表示以数字形式显示数值的类
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();
}
}
}
5 - 表示以简单的图形显示数值的类
public class GraphObserver implements Observer{
@Override
public void update(NumberGenerator generator) {
System.out.print("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();
}
}
}
6 - 测试程序行为的类
public class Main {
public static void main(String[] args) {
NumberGenerator generator = new RandomNumberGenerator();
Observer observer1 = new DigitObserver();
Observer observer2 = new GraphObserver();
generator.addObserver(observer1);
generator.addObserver(observer2);
generator.execute();
}
}
7 - 输出示例
DigitObserver: 9
GraphObserver: *********
DigitObserver: 16
GraphObserver: ****************
DigitObserver: 40
GraphObserver: ****************************************
DigitObserver: 34
GraphObserver: **********************************
DigitObserver: 18
GraphObserver: ******************
DigitObserver: 6
GraphObserver: ******
DigitObserver: 34
GraphObserver: **********************************
DigitObserver: 31
GraphObserver: *******************************
DigitObserver: 17
GraphObserver: *****************
DigitObserver: 47
GraphObserver: ***********************************************
DigitObserver: 21
GraphObserver: *********************
DigitObserver: 34
GraphObserver: **********************************
DigitObserver: 18
GraphObserver: ******************
DigitObserver: 25
GraphObserver: *************************
DigitObserver: 39
GraphObserver: ***************************************
DigitObserver: 20
GraphObserver: ********************
DigitObserver: 9
GraphObserver: *********
DigitObserver: 4
GraphObserver: ****
DigitObserver: 8
GraphObserver: ********
DigitObserver: 26
GraphObserver: **************************
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!