You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

观察者模式中主题类维护多观察者列表是否合理?是否违反模式特性?

你的方案完全可行,且不违反观察者模式特性

嘿,这个群聊场景的观察者模式实现思路挺合理的,咱们来仔细唠唠:

1. 方案的可行性

你在Sender类里维护两个独立的观察者列表(group1和group2)完全没问题。观察者模式的核心逻辑就是「主题(Subject)管理观察者集合,状态变更时通知观察者」——你只是把观察者按群组维度做了拆分,本质还是在遵循这个核心逻辑。

这种分组维护的方式反而很贴合群聊的实际需求:你可以精准地给指定群组的成员发消息,不用把所有观察者都通知一遍,效率更高。

2. 是否违反观察者模式特性?

答案是不违反。观察者模式的核心特性包括:

  • 松耦合:主题和观察者只依赖抽象(这里Sender依赖Receiver抽象,Receiver不用关心Sender内部的分组逻辑)
  • 主题主动通知观察者:你可以通过遍历对应群组的列表来触发通知
  • 观察者响应通知:每个Receiver只需要实现自己的消息接收逻辑就行

你的实现不仅没破坏这些特性,还通过分组让通知逻辑更贴合业务场景——这其实是对基础观察者模式的合理扩展,而非违背。

3. 小优化建议(可选)

如果以后群组数量可能增加(比如要支持创建更多群),维护多个独立的列表会让代码变得冗余。可以把分组改成用Map来管理,扩展性更好:

public class Sender {
    // 用群组名称作为key,对应一组观察者
    private Map<String, List<Receiver>> groups = new HashMap<>();
    private String message;

    // 初始化群组
    public Sender() {
        groups.put("group1", new ArrayList<>());
        groups.put("group2", new ArrayList<>());
    }

    // 添加观察者到指定群组
    public void addReceiver(String groupName, Receiver receiver) {
        groups.get(groupName).add(receiver);
    }

    // 移除指定群组的观察者
    public void removeReceiver(String groupName, Receiver receiver) {
        groups.get(groupName).remove(receiver);
    }

    // 给指定群组发消息
    public void notifyGroup(String groupName) {
        for (Receiver receiver : groups.get(groupName)) {
            receiver.update(message);
        }
    }

    // 设置消息内容
    public void setMessage(String message) {
        this.message = message;
    }
}

这样不管以后加多少群组,都不用新增成员变量,只需要往Map里加新的key-value对就行。

内容的提问来源于stack exchange,提问作者desperatecoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:12:10