在此之前,感谢您的阅读!
我正在用C ++开发应用程序,我想要有关设计问题的建议。让我解释:
我的应用程序的主类有一些集合,但是其他类最终需要从这些集合之一中获取值。像这样:
class MainClass {
private:
// Collections are internally implemented as QHash
Collection<Type1> col1;
Collection<Type2> col2;
};
class RosterUnit {
public:
RosterUnit() {
/* This method needs to get a specific value from col1 and
initialize this class with that data */
}
};
class ObjectAction {
public:
virtual void doAction() = 0;
};
class Action1 : public ObjectAction {
public:
void doAction() {
// This needs a specific value from col2
}
};
class Action2 : public ObjectAction {
public:
void doAction() {
// This needs a specific value from col1
}
};
我的第一种方法是在需要时将整个集合作为参数传递,但是对于ObjectAction子类来说并不是很好,因为我必须传递两个集合,并且如果以后再创建ObjectAction的另一个子类,并且它需要从其他子元素获取元素集合(假设col3),我必须修改每个ObjectAction子类的doAction()签名,我认为这不太灵活。另外,假设我有一个对话框,并希望从那里创建一个RosterUnit。我只需要将集合传递给对话框即可创建RosterUnit。
接下来,我决定在RosterUnit和ObjectAction中使用指向集合的静态变量,但是我对该解决方案并不满意。我认为它不够灵活。
我一直在阅读有关设计模式的内容,我首先认为具有get函数的Singleton可能是一个不错的选择,但经过更多调查后,我认为这不适用于我的情况。如果我使用全局变量,这似乎会更容易,或多或少都一样,但这似乎不是正确的方法。
所以,请给我一些建议吗?
非常感谢你!
最佳答案
如前所述,迭代器非常适合抽象Collection的细节。但是走这条路线意味着使用迭代器的对象将需要知道Collection内部的内容。这意味着他们将需要知道如何确定他们需要的集合中的哪个对象,从而增加耦合。 (下面的“工厂”段落中有更多详细信息)这是您需要考虑的事项。
另一种方法是在MainClass上创建访问器方法,该方法使用某种键并从Collection中返回一个对象(findObject(key))。在内部,MainClass方法将搜索容器并返回适当的对象。要使用这种方法,您将需要访问MainClass,或者通过前面提到的依赖注入,或者可能使它成为Singleton(不过在这种情况下不建议这样做)。
借助到目前为止提供的信息,ObjectAction Factory最好具有对MainClass的引用,并且作为ObjectAction创建逻辑的一部分,可以调用适当的MainClass访问器并将结果传递给ObjectAction,从而将来自MainClass的ObjectAction对象。