观察者模式与观察者模式实例EventBus

什么是观察者模式

顾名思义,观察者模式就是在多个对象之间,定义一个一对多的依赖,当一个对象状态改变时,所有依赖这个对象的对象都会自动收到通知。

观察者模式也称为发布订阅模式(Publish-Subscribe Design Pattern),一般被依赖的对象称为被观察者,依赖的对象称为观察者,不过也有其他的叫法,例如Subject和Observer,Publisher和Subscriber,Producer和Consumer,EvenEemitter(事件发布器)和EventListene,还有Dispatcher和Listener。只要场景符合观察者模式的定义,都算观察者模式的应用。

类图

观察者模式与观察者模式实例EventBus_第1张图片

  • 主题Subject: 主题中包含着所有调用registerObservers来进行注册的 Observer(观察者) ,主题收到消息后,通过notifyObservers方法,告知所有观察者其状态的改变

  • 观察者Observer: 包含着收到消息的处理逻辑,处理逻辑存在于其update方法中

之前在学习设计模式的时候,有了解过这个模式,在使用MQ中间件的时候其实也有实践过观察者模式,不过这次EventBus又接触到了观察者模式,所以就总结记录一下吧,同时也再复习一下观察者模式。

典型代码实现

是从一个博主那里引用过来的,他写的很详细,博主的详细博文在文末链接。

/**
 * 主题接口
 *
 * @author liuyp
 * @date 2022/11/28
 */
public interface Subject<T> {
    void registerObserver(Observer<T> obverser);

    void removeObserver(Observer<T> obverser);

    void notifyObservers(T message);
}


/**
 * 观察者接口
 *
 * @author liuyp
 * @date 2022/11/28
 */
public interface Observer<T> {
    void update(T message);
}

/**
 * 主题的具体实现
 *
 * @author liuyp
 * @date 2022/11/28
 */
public class ConcreteSubject<T> implements Subject<T> {

    /**
     * 线程安全的Set容器,保存obversers
     */
    private Set<Observer<T>> obversers = new CopyOnWriteArraySet<>();

    @Override
    public void registerObserver(Observer<T> obverser) {
        obversers.add(obverser);
    }

    @Override
    public void removeObserver(Observer<T> obverser) {
        System.out.println("Obversable@" + this.hashCode() + " 移除观察者:" + obverser.hashCode());
        obversers.remove(obverser);
    }

    @Override
    public void notifyObservers(T message) {
        System.out.println("Obversable@" + this.hashCode() + " 发布了一条消息:" + message.toString());
        obversers.forEach(obverser -> obverser.update(message));
    }
}

/**
 * 具体的观察者
 *
 * @author liuyp
 * @date 2022/11/28
 */
public class ConcreteObverser<T> implements Observer<T> {
    @Override
    public void update(T message) {
        System.out.println("Obverser@" + this.hashCode() + " 收到通知:" + message);
    }
}

/**
 * 测试类
 *
 * @author liuyp
 * @date 2022/11/28
 */
public class TestMain {
    public static void main(String[] args) {

        //定义主题 也是被观察者observable
        Subject<String> subject = new ConcreteSubject<>();
        //定义观察者 observer
        Observer<String> observer1 = new ConcreteObverser<>();
        Observer<String> observer2 = new ConcreteObverser<>();
        //订阅主题 subject
        subject.registerObserver(observer1);
        subject.registerObserver(observer2);
        //发布通知
        subject.notifyObservers("消息1:明天是2022年11月29日");

        //移除观察者1
        subject.removeObserver(observer1);
        //重新发布通知
        subject.notifyObservers("消息2:琪琪农历10月17生日");
    }
}

Obversable@1802598046 发布了一条消息:消息1:明天是20221129Obverser@240650537 收到通知:消息1:明天是20221129Obverser@483422889 收到通知:消息1:明天是20221129Obversable@1802598046 移除观察者:240650537
Obversable@1802598046 发布了一条消息:消息2:琪琪农历1017生日
Obverser@483422889 收到通知:消息2:琪琪农历1017生日

观察者模式的作用

可以使得发布者和订阅者的代码解耦合,增加代码的可靠性和灵活性。

EventBus

下期我们再来说说观察者模式的应用EventBus~

原博客不小心关掉了 找不到了 如有侵权 请博主与我联系我挂上博主原文连接~

你可能感兴趣的:(观察者模式)