Java实现观察者模式

一、前言

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

二、具体实现

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("今天下午两点来村委会开会!");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

new666999

你的鼓励将是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值