C++ 软件设计选项,类关系

标签 c++ class relationships

问题:

我有完全独立的软件管理器(软件实体),例如 CCarManager、CTruckManager 等。有时我正在创建新对象,例如 CCar。 CCar 必须与各种不同的管理器有关系,例如,与 CResourceManager、CTruckManager。将 CCar 与这些经理联系起来的最佳方式是什么?

解决方案:

  1. 拥有全局软件管理器(头文件中的 Singleton 或 extern) [不喜欢全局变量]

  2. 使用一个全局点并将其传递给其他对象,例如 CCar(CApplication)、CApplication->TrukManager()、CApplication->CarManager()... [看起来不太好,但可以传一指]

  3. 传递给 CCar(CCarManager *pCarManager, CTruckManager *pTruckManager....) [难以扩展]

  4. 使用观察者模式,例如CCar.Attach(CCarManager), CCar.Attach(CTruckManager); [易于扩展,但主要关注处理方法调用,哪些部分负责什么等,还有很多检查]

  5. 工厂。

    类 CCarFactory(CCarManager *pMngr) { CCar *CreateCar() { 返回 CCar(m_pCarManager); }

还有哪些方法?

最佳答案

您可以在 CCar 的构造函数中传递对 CResourceManagerCTruckManager 等的引用。

CCar(const CResourceManager& resourceMgr, const CTruckManager& truckMgr):
    _resourceMgr(resourceMgr), _truckMgr(truckMgr) {
    //relevant construtor code here
}

这样也可以轻松地使用模拟实现进行测试。不知道“经理类的作用”就很难说。

恕我直言,名称以“Manager”结尾的类通常要么命名不当(我做过的次数多得数不过来),要么设计不当。

关于C++ 软件设计选项,类关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17843663/

相关文章:

C++ 'Email' 没有命名类型

database - 图数据库中的二阶关系

c# - 级联多重关系

mysql - 所需产品选项 laravel

c++ - 如何用等距透视渲染?

c++ - 一个抽象类可以作为其他具体类的成员作为组合关系吗? C++

javascript - es6 类将 this 传递给静态类函数

c++ - 如何在 OpenCV 中查找图像中的轮廓?

c++ - 为什么我这个delete有异常?

c++ - Qt dragEnterEvent 未被调用