问题:
我有完全独立的软件管理器(软件实体),例如 CCarManager、CTruckManager 等。有时我正在创建新对象,例如 CCar。 CCar 必须与各种不同的管理器有关系,例如,与 CResourceManager、CTruckManager。将 CCar 与这些经理联系起来的最佳方式是什么?
解决方案:
拥有全局软件管理器(头文件中的 Singleton 或 extern) [不喜欢全局变量]
使用一个全局点并将其传递给其他对象,例如 CCar(CApplication)、CApplication->TrukManager()、CApplication->CarManager()... [看起来不太好,但可以传一指]
传递给 CCar(CCarManager *pCarManager, CTruckManager *pTruckManager....) [难以扩展]
使用观察者模式,例如CCar.Attach(CCarManager), CCar.Attach(CTruckManager); [易于扩展,但主要关注处理方法调用,哪些部分负责什么等,还有很多检查]
工厂。
类 CCarFactory(CCarManager *pMngr) { CCar *CreateCar() { 返回 CCar(m_pCarManager); }
还有哪些方法?
最佳答案
您可以在 CCar
的构造函数中传递对 CResourceManager
、CTruckManager
等的引用。
CCar(const CResourceManager& resourceMgr, const CTruckManager& truckMgr):
_resourceMgr(resourceMgr), _truckMgr(truckMgr) {
//relevant construtor code here
}
这样也可以轻松地使用模拟实现进行测试。不知道“经理类的作用”就很难说。
恕我直言,名称以“Manager”结尾的类通常要么命名不当(我做过的次数多得数不过来),要么设计不当。
关于C++ 软件设计选项,类关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17843663/