问题:

我有完全独立的软件管理器(软件实体),例如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);
    }

  • 还有哪些其他方式?

    最佳答案

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

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

    这样,也可以轻松地通过模拟实现进行测试。不知道'Manager类的作用是很难说的。

    恕我直言,其名称以“Manager”结尾的类通常要么命名不正确(我做的次数超过了我的计算次数),要么设计得不好。

    09-27 07:38