我有一个类来保存数据并公开访问该数据的方法:GameInfoList。基于3个接口创建数据:A,B,C。我还有2个接口来获取特定数据:D,E。
我需要在两个类之间共享GameInfoList,这是我的方法:
//fills GameInfoList based on interfaces called by the different clients.
class GameInfo: public A, public B, public C
{
public:
GameInfo(GameInfoList&)
//A,B,C impl
private:
GameInfoList& gameInfoList;
};
//reads GameInfoList and allow to get a particular info.
class GameInfoProvider: public D, public E
{
public:
GameInfoProvider(const GameInfoProvider&)
//D,E impl
private:
const GameInfoList& gameInfoList;
};
是否有任何涉及上述情况的设计模式? 您如何看待我的方法?
修改 GameInfoList,GameInfo和GameInfoProvider对象存在于“Component”类中,因此生命周期很明确。组件之间的通信基于节俭。
答案 0 :(得分:1)
这是控制模式的反转。 C ++中的问题是GameInfoList没有明确的所有权。
如果你的代码训练有素,那可能不是问题。但是如果你的代码超过 - 哦 - 一个程序员正在处理它,它有点脆弱,因为暗示了共享所有权,并且GameInfoList的生命周期超出了GameInfo和GameInfoProvider的控制范围。
要解决“谁拥有GameInfoList,无论如何?”问题,您可以使用std::shared_ptr<GameInfoList>
,这样GameInfoList的所有权非常明确。
//fills GameInfoList based on interfaces called by the different clients.
class GameInfo: public A, public B, public C
{
public:
GameInfo(std::shared_ptr<GameInfoList>)
//A,B,C impl
private:
std::shared_ptr<GameInfoList> gameInfoList;
};
//reads GameInfoList and allow to get a particular info.
class GameInfoProvider: public D, public E
{
public:
GameInfoProvider(std::shared_ptr<GameInfoList>)
//D,E impl
private:
std::shared_ptr<GameInfoList> gameInfoList;
};
请注意,GameInfoProvider失去了使用GameInfoList的常量。如上所述,这是试图表达共同所有权的不幸事件。
如果使用std::shared_ptr<const GameInfoList>
,则将GameInfoList视为不可变值对象,但您必须在GameInfo中以此方式表达。
在C ++中,在实例对象中具有引用成员变量还有其他缺点。 std :: shared_ptr也有帮助。