一、前言
观察者模式,又称为发布订阅模式,是一种行为设置模式,允许对象之间建立一对多的依赖关系,这样当一个对象状态改变时,它的所有依赖者(观察者)都会收到通知并自动更新。
二、具体实现
1、发布订阅案例(类似mqtt)
观察者接口:
/**
* @Description: 观察者接口
* @Date: 2025-01-03 13:24
* @Author: gaoyufei
**/
public interface Observer {
void receiveInfo(String message);
}
观察者实现:
/**
* @Description: 订阅客户端
* @Date: 2025-01-03 13:25
* @Author: gaoyufei
**/
public class Client implements Observer{
public String clientId;
public Client(String clientId){
this.clientId=clientId;
}
@Override
public void receiveInfo(String message) {
System.out.println("客户端:"+clientId+" 收到消息:"+message);
}
}
注册中心:
import java.util.ArrayList;
import java.util.List;
/**
* @Description: 注册中心,相当于mqtt
* @Date: 2025-01-03 13:32
* @Author: gaoyufei
**/
public class RegisterCenter{
private static List<Observer> observers=new ArrayList<>();
public static void add(Observer observer) {
observers.add(observer);
}
public static void del(Observer observer) {
observers.remove(observer);
}
public static void sendMsg(String message) {
observers.stream().forEach(e->{
e.receiveInfo(message);
});
}
}
模拟设备发布消息:
/**
* @Description: 设备
* @Date: 2025-01-03 13:34
* @Author: gaoyufei
**/
public class Device{
static Client client1=new Client("001");
static Client client2=new Client("002");
static {
RegisterCenter.add(client1);
RegisterCenter.add(client2);
}
public static void main(String[] args) {
RegisterCenter.sendMsg("来自设备的一条新消息");
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
RegisterCenter.sendMsg("设备掉线了");
RegisterCenter.del(client1);
RegisterCenter.del(client2);
}));
}
}
2、村长通知村民案例
观察者接口:
/**
* @Description: 观察者接口
* @Date: 2025-01-03 13:24
* @Author: gaoyufei
**/
public interface Observer {
void receiveInfo(String message);
}
观察者具体实现,村民:
/**
* @Description: 村民
* @Date: 2025-01-03 13:40
* @Author: gaoyufei
**/
public class Villager implements Observer{
private String name;
public Villager(String name){
this.name=name;
}
@Override
public void receiveInfo(String message) {
System.out.println("村民:"+name+" 收到消息:"+message);
}
}
注册接口:
/**
* @Description: 注册接口
* @Date: 2025-01-03 13:30
* @Author: gaoyufei
**/
public interface Register {
void add(Observer observer);
void del(Observer observer);
void notify(String message);
}
注册接口的具体实现,村委会:
/**
* @Description: 村委会
* @Date: 2025-01-03 13:44
* @Author: gaoyufei
**/
public class VillageCommittee implements Register{
private List<Observer> observerList=new ArrayList<>();
@Override
public void add(Observer observer) {
this.observerList.add(observer);
}
@Override
public void del(Observer observer) {
this.observerList.remove(observer);
}
@Override
public void notify(String message) {
this.observerList.stream().forEach(e->{
e.receiveInfo(message);
});
}
}
村长登记村民信息,给村民发布信息:
/**
* @Description: 村长
* @Date: 2025-01-03 13:49
* @Author: gaoyufei
**/
public class VillageLeader {
public static void main(String[] args) {
Register villageCommittee=new VillageCommittee();
Observer villager1=new Villager("二喜");
Observer villager2=new Villager("狗蛋");
villageCommittee.add(villager1);
villageCommittee.add(villager2);
villageCommittee.notify("今天下午两点来村委会开会!");
}
}