行为型模式 - 观察者模式 (Publish/Subscribe)

行为型模式 - 观察者模式 (Publish/Subscribe)

订阅发布模式(Publish-Subscribe Pattern)是一种消息传递模式,在该模式中,发送者(发布者)不会直接将消息发送给特定的接收者(订阅者),而是将消息发布到一个中间的消息代理(如主题或频道),订阅了该主题的订阅者可以接收到这些消息。以下是几个订阅发布模式的经典案例。


java 复制代码
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

// 主题接口
interface Subject {
    void registerObserver(Observer observer, String newsType);
    void removeObserver(Observer observer, String newsType);
    void notifyObservers(String newsType, String news);
}

// 观察者接口
interface Observer {
    void update(String news);
}

// 新闻机构类,实现主题接口
class NewsAgency implements Subject {
    private Map<String, List<Observer>> observers = new HashMap<>();

    @Override
    public void registerObserver(Observer observer, String newsType) {
        observers.computeIfAbsent(newsType, k -> new ArrayList<>()).add(observer);
    }

    @Override
    public void removeObserver(Observer observer, String newsType) {
        List<Observer> observerList = observers.get(newsType);
        if (observerList != null) {
            observerList.remove(observer);
        }
    }

    @Override
    public void notifyObservers(String newsType, String news) {
        List<Observer> observerList = observers.get(newsType);
        if (observerList != null) {
            for (Observer observer : observerList) {
                observer.update(news);
            }
        }
    }

    public void publishNews(String newsType, String news) {
        System.out.println("发布 " + newsType + " 新闻: " + news);
        notifyObservers(newsType, news);
    }
}

// 用户类,实现观察者接口
class User implements Observer {
    private String name;

    public User(String name) {
        this.name = name;
    }

    @Override
    public void update(String news) {
        System.out.println(name + " 收到新闻: " + news);
    }
}

// 客户端代码
public class NewsSystem {
    public static void main(String[] args) {
        NewsAgency newsAgency = new NewsAgency();

        User user1 = new User("张三");
        User user2 = new User("李四");

        // 用户订阅体育新闻
        newsAgency.registerObserver(user1, "体育");
        newsAgency.registerObserver(user2, "体育");

        // 用户订阅财经新闻
        newsAgency.registerObserver(user1, "财经");

        // 发布体育新闻
        newsAgency.publishNews("体育", "篮球比赛结果公布");

        // 发布财经新闻
        newsAgency.publishNews("财经", "股市行情上涨");
    }
}
相关推荐
workflower1 天前
例二:某汽车制造企业深度融合AI智能体,构建园区网络的智能运维体系
人工智能·机器学习·设计模式·机器人·云计算·汽车·制造
ly76891 天前
Java 设计模式详解:从原则到 23 种经典模式
java·开发语言·设计模式
AI人工智能+电脑小能手1 天前
大白话说Java设计模式-14-适配器模式(业务实战篇)
java·设计模式·适配器模式·系统兼容·多渠道对接
略略略咯咯1 天前
(总结)设计模式
设计模式
Cosolar2 天前
DeepSeek Harness 理解 Harness 的设计哲学 - 可组合的插件运行时
人工智能·设计模式·架构
Nebula_g2 天前
JavaSE基础语法:特殊类(特殊情景下的设计模式)
java·开发语言·设计模式
George_Ye3 天前
同一本书,一人一份:我如何设计 AI 个性化扫书报告
设计模式
莫得感情 o3 天前
设计模式 22 · 三个冷门模式:中介者、访问者、解释器
java·设计模式
AI人工智能+电脑小能手4 天前
大白话说Java设计模式-08-建造者模式(业务实战篇)
java·设计模式·建造者模式·架构设计·对象构建
AustinXu4 天前
从 Claude Code 到 Claude Tag,Harness Engineering 走到了组织这一层
设计模式·团队管理