Java实现观察者(发布-订阅)模式

Posted lypzz.com

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java实现观察者(发布-订阅)模式相关的知识,希望对你有一定的参考价值。

观察者模式(Observer),也叫发布-订阅模式(Publish-Subscribe)
观察者模式涉及到被观察的主题(Subject)与观察者(Observer)2个角色,主题发布消息,观察者响应消息。
观察者可以订阅主题,也可以取消订阅。

观察者模式示例:主播与粉丝

  • 主题(发布者)是直播网站主播,其业务是在线直播;
  • 观察者(订阅者)是主播的粉丝,只要主播开始直播,就通知粉丝
  • 粉丝不喜欢主播了,可以取消订阅
  • 一个主播可以有多个粉丝,一个粉丝也可以订阅多个主播

观察者接口

update方法是每个观察者必须实现的方法,用于响应主题发送的消息,其参数是主题传递给观察者的数据

public interface Observer
{
    // 更新
    void update(String anchorName,boolean online);
}

主题(发布者)接口

public interface Subject
{
    // 注册观察者
    void registerObserver(Observer observer);
    // 移除观察者
    void removeObserver(Observer observer);
    // 通知所有观察者
    void notifyObservers();
}

观察者具体实现类

观察者可以有任意多个,这里只写一个示例

// 粉丝迟汉
public class ChiHan implements Observer
{
    @Override
    public void update(String anchorName,boolean online)
    {
        if(online)
        {
            System.out.printf("主播%s上线了!快去看她!%n",anchorName);
        }
        else
        {
            System.out.printf("主播%s下线了!可以睡了!%n",anchorName);
        }
    }
}

主题(发布者)具体实现类

主题可以有多个,这里只写一个示例

// 主播冯提莫
public class FengTimo implements Subject
{
    private boolean online;
    private List<Observer> fans;

    public FengTimo()
    {
        this.online=false;
        this.fans=new ArrayList<>();
    }

    @Override
    public void registerObserver(Observer fan)
    {
        fans.add(fan);
    }

    @Override
    public void removeObserver(Observer fan)
    {
        fans.remove(fan);
    }

    @Override
    public void notifyObservers()
    {
        fans.forEach(fan->{
            fan.update("冯提莫",online);
        });
    }

    // 主题状态改变后,通知所有观察者
    public void setOnline(boolean online)
    {
        this.online=online;
        onlineChanged();
    }

    public void onlineChanged()
    {
        notifyObservers();
    }
}

测试

public static void main(String[] args)
{
    // 主播(主题)
    FengTimo fengTimo=new FengTimo();
    // 粉丝(观察者)
    Observer chiHan=new ChiHan();
    // 注册观察者
    fengTimo.registerObserver(chiHan);

    // 主题状态改变,自动通知观察者
    fengTimo.setOnline(true);
    fengTimo.setOnline(false);
    // 移除观察者,观察者将不再收到消息
    fengTimo.removeObserver(chiHan);
    fengTimo.setOnline(true);
}

输出

主播冯提莫上线了!快去看她!
主播冯提莫下线了!可以睡了!

以上是关于Java实现观察者(发布-订阅)模式的主要内容,如果未能解决你的问题,请参考以下文章

Java实现观察者(发布-订阅)模式

观察者模式(Observer)和发布(Publish/订阅模式(Subscribe)的区别

Java里观察者模式(订阅发布模式)

观察者模式/ java实现附代码 /

发布订阅模式实现及发布订阅者模式与观察者模式的不同

发布订阅模式和观察者模式