一、前言
观察者模式,又称为发布订阅模式,是一种行为设置模式,允许对象之间建立一对多的依赖关系,这样当一个对象状态改变时,它的所有依赖者(观察者)都会收到通知并自动更新。
二、具体实现
1、发布订阅案例
观察者接口:
/**
* @Description: 观察者接口
* @Date: 2024-12-27 10:08
* @Author: gaoyufei
**/
public interface Observer {
void accept(String message);
}
观察者实现:
/**
* @Description: 订阅者
* @Date: 2024-12-27 10:10
* @Author: gaoyufei
**/
public class Subscriber implements Observer{
public String clientId;
public Subscriber(String clientId){
this.clientId=clientId;
}
@Override
public void accept(String message) {
System.out.println("订阅者:"+clientId+" 接受到消息:"+message);
}
}
主题接口:
/**
* @Description: 主题接口
* @Date: 2024-12-27 10:15
* @Author: gaoyufei
**/
public interface Subject {
void add(Observer observer);
void del(Observer observer);
void notify(String message);
}
主题实现:
import java.util.ArrayList;
import java.util.List;
/**
* @Description: 主题,维护了订阅者列表,通知订阅者
* @Date: 2024-12-27 10:16
* @Author: gaoyufei
**/
public class Topic implements Subject {
private List<Observer> observerList=new ArrayList<>();
@Override
public void add(Observer observer) {
observerList.add(observer);
}
@Override
public void del(Observer observer) {
observerList.remove(observer);
}
@Override
public void notify(String message) {
observerList.stream().forEach(e->{
e.accept(message);
});
}
}
模拟订阅者订阅主题,客户端发布消息:
/**
* @Description: 模拟订阅者订阅主题,客户端发布消息
* @Date: 2024-12-27 10:18
* @Author: gaoyufei
**/
public class Client {
public static void main(String[] args) {
Topic topic=new Topic();
Subscriber subscriber1=new Subscriber("001");
Subscriber subscriber2=new Subscriber("002");
Subscriber subscriber3=new Subscriber("003");
topic.add(subscriber1);
topic.add(subscriber2);
topic.add(subscriber3);
topic.notify("您有一条新消息!");
}
}
2、村长通知村民案例
观察者接口:
/**
* @Description: 观察者接口
* @Date: 2024-12-27 9:35
* @Author: gaoyufei
**/
public interface Observer {
void accept(String message);
}
观察者具体观察者村民:
/**
* @Description: 具体观察者,村民,能接受消息
* @Date: 2024-12-27 9:37
* @Author: gaoyufei
**/
public class Resident implements Observer{
private String name;
public Resident(String name){
this.name=name;
}
@Override
public void accept(String message) {
System.out.println("村民:"+this.name+" 收到信息:"+message);
}
}
抽象主题:
/**
* @Description: 抽象主题
* @Date: 2024-12-27 9:39
* @Author: gaoyufei
**/
public interface Subject {
void add(Observer observer);
void del(Observer observer);
void notify(String message);
}
主题的具体实现,村长的记录本:
import java.util.ArrayList;
import java.util.List;
/**
* @Description: 主题的具体实现,村长的记录本,维护了村民信息,村长可以通过记录本给村民群发信息
* @Date: 2024-12-27 9:42
* @Author: gaoyufei
**/
public class RecordBook implements Subject {
private List<Observer> observerList = new ArrayList<>();
@Override
public void add(Observer observer) {
observerList.add(observer);
}
@Override
public void del(Observer observer) {
observerList.remove(observer);
}
@Override
public void notify(String message) {
observerList.stream().forEach(e -> {
e.accept(message);
});
}
}
村长登记村民信息,用记录本给村民群发信息:
/**
* @Description: 村长登记村民信息,用记录本给村民群发信息
* @Date: 2024-12-27 9:44
* @Author: gaoyufei
**/
public class VillageHead {
public static void main(String[] args) {
// 1、村里,村长有一个记录村民电话的本子,村民都需要登记一下。
// 在村里有什么事情的时候,村长就通过群发消息的方式通知村民。
// 2、村民就是观察者、订阅者,村长发布信息,记录本就是主题,
RecordBook recordBook=new RecordBook();
Resident resident=new Resident("王满银");
Resident resident1=new Resident("孙玉亭");
Resident resident2=new Resident("孙玉厚");
recordBook.add(resident);
recordBook.add(resident1);
recordBook.add(resident2);
recordBook.notify("大家好,今天下午三点来村支部开会,有重要事情通知!");
}
}