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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:31:27