C++中基于观察者模式实现两个容器类共享对象的同步更新问询
基于观察者模式的实现方案
完全理解你的需求,用观察者模式来实现这个自动更新逻辑非常合适,我给你拆解成具体的实现步骤和代码示例:
1. 定义观察者接口
首先得给观察者(也就是FirstContainer和SecondContainer)定一个统一的接口,这样被观察者(ThirdContainer)不用关心具体是哪个观察者,只需要调用接口方法通知更新就行:
public interface ContainerObserver { // 当ThirdContainer变化时,被调用的更新方法 void update(); }
2. 实现被观察者:ThirdContainer
ThirdContainer需要维护一个观察者列表,同时在成员发生变化(add/del操作)时,主动通知所有观察者。另外还要提供添加/移除观察者的方法,以及你提到的成员操作方法:
import java.util.ArrayList; import java.util.List; public class ThirdContainer { // 存储成员的集合 private List<String> members = new ArrayList<>(); // 观察者列表 private List<ContainerObserver> observers = new ArrayList<>(); // 添加观察者 public void addObserver(ContainerObserver observer) { if (!observers.contains(observer)) { observers.add(observer); } } // 移除观察者 public void removeObserver(ContainerObserver observer) { observers.remove(observer); } // 通知所有观察者更新 private void notifyObservers() { for (ContainerObserver observer : observers) { observer.update(); } } // --- 你需求中的成员操作方法 --- public void addMemberToThirdContainer(String member) { members.add(member); // 添加后通知观察者 notifyObservers(); } public void delMemberOfThirdContainer(String member) { members.remove(member); // 删除后通知观察者 notifyObservers(); } public List<String> getThirdContainerMembers() { // 返回成员的副本,避免外部直接修改内部集合 return new ArrayList<>(members); } }
3. 实现观察者:FirstContainer和SecondContainer
这两个类需要实现ContainerObserver接口,在update()方法里调用getThirdContainerMembers()来同步最新状态。同时它们要持有ThirdContainer的引用,方便调用成员方法和获取最新数据:
public class FirstContainer implements ContainerObserver { private ThirdContainer thirdContainer; // 存储本地同步的成员列表 private List<String> localMembers; public FirstContainer(ThirdContainer thirdContainer) { this.thirdContainer = thirdContainer; // 初始化时先同步一次数据 this.localMembers = thirdContainer.getThirdContainerMembers(); // 将自己注册为ThirdContainer的观察者 thirdContainer.addObserver(this); } @Override public void update() { // 自动调用get方法更新本地数据 this.localMembers = thirdContainer.getThirdContainerMembers(); System.out.println("FirstContainer已更新成员:" + localMembers); } // 你需求中的其他方法示例 public void addMember(String member) { thirdContainer.addMemberToThirdContainer(member); } public void delMember(String member) { thirdContainer.delMemberOfThirdContainer(member); } }
public class SecondContainer implements ContainerObserver { private ThirdContainer thirdContainer; private List<String> localMembers; public SecondContainer(ThirdContainer thirdContainer) { this.thirdContainer = thirdContainer; this.localMembers = thirdContainer.getThirdContainerMembers(); thirdContainer.addObserver(this); } @Override public void update() { this.localMembers = thirdContainer.getThirdContainerMembers(); System.out.println("SecondContainer已更新成员:" + localMembers); } // 同样实现需求中的操作方法 public void addMember(String member) { thirdContainer.addMemberToThirdContainer(member); } public void delMember(String member) { thirdContainer.delMemberOfThirdContainer(member); } }
4. 测试演示
写个测试类验证一下效果:
public class TestContainer { public static void main(String[] args) { // 创建共享的ThirdContainer实例 ThirdContainer third = new ThirdContainer(); // 创建两个观察者容器,传入同一个ThirdContainer引用 FirstContainer first = new FirstContainer(third); SecondContainer second = new SecondContainer(third); // 操作成员,看两个容器是否自动更新 first.addMember("Alice"); // 输出: // FirstContainer已更新成员:[Alice] // SecondContainer已更新成员:[Alice] second.delMember("Alice"); // 输出: // FirstContainer已更新成员:[] // SecondContainer已更新成员:[] } }
关键细节说明
- 解耦性:ThirdContainer不需要知道First/SecondContainer的具体实现,只依赖
ContainerObserver接口,后续如果加新的观察者容器,直接实现接口注册即可,不用修改ThirdContainer的代码。 - 数据安全:
getThirdContainerMembers()返回的是集合副本,避免外部直接修改ThirdContainer的内部数据,保证数据一致性。 - 自动触发:每次调用
addMemberToThirdContainer或delMemberOfThirdContainer后,都会自动调用notifyObservers(),触发所有观察者的update()方法,从而同步最新数据。
内容的提问来源于stack exchange,提问作者soall
相关产品推荐
相关产品推荐

