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实现观察者(发布-订阅)模式的主要内容,如果未能解决你的问题,请参考以下文章