2

问题:

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

解决方案:

  1. 有全局软件管理器(头文件中的单例或外部)[不喜欢全局]

  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() { return CCar(m_pCarManager); } }

还有什么其他方法?

4

3 回答 3

1

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

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

这样也很容易使用模拟实现进行测试。如果不知道 'Manager 类做什么,就很难说。

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

于 2013-07-24T20:45:28.510 回答
-1

如果您不使用 Singleton 模式的唯一原因是因为您不喜欢它,我认为您可能需要重新考虑您的方法。

单例是您想要在这里实现的完美模式。您的管理类应该只有一个实例,并且需要许多其他类的访问。

于 2013-07-24T22:47:28.920 回答
-1

如果没有更多规范,很难说...如果 CCar 需要对管理器方法(如内部变量/方法)的特殊访问,反之亦然,您可以在 CCar 管理器中声明为友元,或在这些管理器类中将 CCar 声明为友元。

简单的例子,注意可怜的成员名称

class CCar
{
    int I;
public:
    friend class CManager;
    CCar(int i): I(i) {}

};

class CManager
{
    int D;
public:
    CManager(int i, CCar& car): D(i) 
    {
        car.I = 5;      // modify CCar instance internal member
    }

};

反之亦然,如果它反过来。

如果一个 CCar 实例可以有多个 CCarManager,您可以设置一个指针数组以将这些管理器“链接”到 CCar 的实例。与其拥有 3 个不同的 pManager 数组,不如拥有一个 Manager 基类,并将这些管理器子类化到它,而是让您将所有对管理器的引用存储在一个数组中。

class Manager // etc...

class CResourceManager : public Manager 

// in CCar
std::vector<Manager*> _mgrs;
// or if heap allocated
std::vector<std::shared_ptr<Manager>> _mgrs; // assuming multiple CCars can reference same manager instance

另一种方法可能是拥有一个可以保存特定实例的所有管理器引用的结构/类。

struct MgrRefs
{
    std::vector<CCarManager*> _pCarMgrs;
    std::vector<CResourceManager*> _pResMgrs;
    // etc....
};
于 2013-07-24T22:49:42.520 回答