观察者模式

本文介绍了观察者模式的基本概念,包括Subject与Observer的主要接口,并通过一个具体实现案例展示了如何添加、移除观察者以及通知所有注册的观察者更新状态。此外还讨论了在不同场景下如何扩展观察者以及异步更新的可能性。
摘要由CSDN通过智能技术生成

观察者模式由Subject与Observer组成,它们的主要接口如下:

interface Subject{
    // 添加一个观察者
    void registerObserver(Observer observer);

    // 移除一个观察者
    void removeObserver(Observer observer);

    // 通知所有注册的Observer,来执行它们的update方法
    void notifyObservers();
}

interface Observer{
    // 当Subject调用notifyObservers后,会调用这个方法,所有的Observer的update方法参数要一样
    void update(int i);
}

给出一个具体实现的例子:

public class MySubject implements Subject{
    // 一般我们会定义一个List来存放所有的Observer
    List<Observer> observers = new ArrayList<>();

    private int i;

    // 注册一个observer
    public void registerObserver(Observer observer){
        observers.add(observer);
    }

    // 从observer列表中删除一个observer
    public void removeObserver(Observer observer){
        observers.remove(observer);
    }

    // 触发从observer列表中每个observer的update方法,这些update的方法的参数往往都是一样的
    public void notifyObservers(){
        for(Observer observer:observers)
            observer.update(i);
    }

    public void doSomething(){
        i = 10;
        notifyObservers();
    }
}

// 下面实现两个Observer,各自的update方法会输出不一样的信息

public class MyObserver1 implements Observer{
    public void update(int i){
        System.out.println("observer1:"+i);
    }
}

public class MyObserver2 implements Observer{
    public void update(int i){
        System.out.println("observer2:"+(i*i));
    }
}

// 下面实现一个测试类
public Test{
    public static void main(String[] args) {
        MyObserver1 o1 = new MyObserver1();
        MyObserver2 o2 = new MyObserver2();
        MySubject s = new MySubject();
        s.registerObserver(o1);
        s.registerObserver(o2);
        s.doSomething();
    }
}

输出结果
observer1:10
observer2:100

如果当执行doSomething时,需要对i进行其它的监管,那就在实现一个MyObserver3与update方法即可,然后注册到MySubject中即可,而不需要改动doSomething函数。

如果update方法很耗时,我们也可以开一个子线程,使用异步的方式来执行update。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值