观察者模式中主题类维护多观察者列表是否合理?是否违反模式特性?
你的方案完全可行,且不违反观察者模式特性
嘿,这个群聊场景的观察者模式实现思路挺合理的,咱们来仔细唠唠:
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
相关产品推荐
相关产品推荐

