2

問題:

CCarManager、CTruckManager など、完全に別のソフトウェア マネージャー (ソフトウェア エンティティ) があります。ある時点で、CCar などの新しいオブジェクトを作成しています。CCar は、CResourceManager、CTruckManager など、さまざまな個別のマネージャーとの関係を持っている必要があります。これらのマネージャーと CCar をリンクする最良の方法は何ですか?

ソリューション:

  1. グローバル ソフトウェア マネージャー (ヘッダー ファイルに Singleton または extern) がある [グローバルは好きではない]

  2. 1 つのグローバル ポイントを使用して、CCar(CApplication)、CApplication->TrukManager()、CApplication->CarManager() などの他のオブジェクトに渡します...

  3. CCar(CCarManager *pCarManager, CTruckManager *pTruckManager....) に渡す [拡張が難しい]

  4. CCar.Attach(CCarManager)、CCar.Attach(CTruckManager) などの Observer パターンを使用します。【拡張しやすいが、メソッド呼び出しの扱いが中心になる、どこが何を担当するかなど、チェックも多い】

  5. 工場。

    class CCarFactory(CCarManager *pMngr) { CCar *CreateCar() { return CCar(m_pCarManager); } }

他の方法は何ですか?

4

3 に答える 3

1

のコンストラクタCResourceManagerCTruckManager、 などへの参照を渡すことができます。CCar

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

このようにして、モック実装でも簡単にテストできます。「マネージャークラスが何をするかを知らずに言うのは難しい.

私見ですが、名前が「Manager」で終わるクラスは、多くの場合、名前が不十分であるか (数え切れないほど何度も行ってきました)、設計が不十分です。

于 2013-07-24T20:45:28.510 に答える
-1

Singleton パターンを使用しない唯一の理由が気に入らないという場合は、アプローチを再検討することをお勧めします。

シングルトンは、ここで達成しようとしていることの完璧なパターンです。1 つのインスタンスのみを持ち、他の多くのクラスからのアクセスを必要とする管理クラスがあります。

于 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 ベース クラスを持ち、それらのマネージャーをそれにサブクラス化することで、マネージャーへのすべての参照を 1 つの配列に格納できます。

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 に答える