当前位置: 首页 > article >正文

Java实现观察者模式

一、前言

观察者模式,又称为发布订阅模式,是一种行为设置模式,允许对象之间建立一对多的依赖关系,这样当一个对象状态改变时,它的所有依赖者(观察者)都会收到通知并自动更新。

二、具体实现

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("大家好,今天下午三点来村支部开会,有重要事情通知!");
    }
}

http://www.kler.cn/a/454968.html

相关文章:

  • 同步与异步日志系统的深入探讨与应用
  • 箭头函数与普通函数的区别
  • 使用 .NET 6 或 .NET 8 上传大文件
  • 【远程桌面】被窥屏
  • selenium浏览器下载汇总
  • 详解从输入url到页面渲染
  • 抖音短视频矩阵系统:开启短视频创作与营销新篇
  • webrtc-internals调试工具
  • Overleaf中设置表格中的字体为Times New Roman
  • 如何通过 360 驱动大师检查自己电脑上的显卡信息
  • 【速成51单片机】1.已经学过stm32如何快速入门51单片机——软件下载与安装
  • Flutter适配HarmonyOS实践
  • AndroidStudio/IDEA类名前面为什么有数字(书签功能)
  • Kotlin 协程基础知识总结二 —— 启动与取消
  • OpenCV的FAST和goodFeaturesToTrack的區別
  • 工程设计优化问题:改进海鸥算法(Matlab)
  • Figma插件:提高设计工作效率
  • MySQL 构建 1000 万数据太慢?如何快速构建大量模拟数据?
  • 打破视障壁垒,百度文心快码无障碍版本助力视障IT从业者就业无“碍”
  • 理解有放回和无放回抽样 (Python)