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 协议 ,转载请注明出处!