我对设计有疑问。有一个类A,它拥有类型为Foo的对象的映射。 A的对象创建Foo对象并将其存储在地图中,但是当出现某种指示时,我想在B类中进行一些工作并在那里创建更多的Foo对象。 A知道B并将其委派给它,但反之则不然。在B中创建的Foo对象仍然需要进入A中的地图。
可能的解决方案:
以某种方式,我感到这两种方法都是不好的,并且B类不应真正创建它不拥有的对象。在这种情况下是否有一些设计模式会有所帮助?我当时在考虑一些工厂,但这只是为问题添加代理,我并不认为这样做会有很大帮助。或者,也许我应该完全摆脱B类,并掌握A中的所有逻辑?但是,这里的问题是我不希望A做太多。
答案 0 :(得分:0)
您可以提供适当的处理程序,类似于以下内容:
class B
{
public:
template <typename T>
void execute(T newObjectHandler)
{
Foo* foo = new Foo();
newObjectHandler(foo);
executeTask(foo);
}
};
void A::executeTask()
{
myB->executeTask([this](Foo* foo) { /* insert into map */ });
}
答案 1 :(得分:0)
只要您明确说明了从类B创建并转移到类A的Foo对象的所有权,就可以使用您的1.解决方案了,因为删除将在A中进行。
合并两个地图应该没什么大不了的。
与您的2.解决方案相比,它具有强大的优势:
-与A的内部映射不存在耦合关系>返回类型在A或B中可以独立变化,从而使您将来可以在另一个C类中使用相同的类型,从而可以将Foo对象保存在vector<Foo>
>