2012-01-20 7 views
0

拡張可能なライブラリを作成したいと思います。異なる基本オブジェクト手順にどのようなデザインパターンを使用するのですか

class Object 
{ 
    ActionProc* pAP; 
};  
class Sphere : public Object; 
class Point : public Object; 

class ActionProc 
{ 
    virtual Action(Object*) = 0;   
}; 

class ActionProcMove : public ActionProc 
{ 
    bool m_bCanMove;  

    virtual Action(Object* obj) 
    { 
     if(m_bCanMove) 
     { 
      //do some moving stuff 
     } 
    }; 
}; 

そしてそうのようにそれを拡張するかもしれない、このライブラリのユーザー:ここでは大まかなコードのアウトラインです (再び、単にコードのアウトライン)

class ActionProcSize : public ActionProc 
{ 
    bool m_bCanSize;  

    virtual Action(Object* obj) 
    { 
     if(m_bCanSize) 
     { 
      //do some sizing stuff 
     } 
    }; 
}; 

これは動作しますが、それは意味します私は作成するオブジェクトオブジェクトごとに手続きオブジェクトを作成する必要があります。代わりに、私はそのタイプの手続きを必要とするすべてのオブジェクトのためのただ一つの手続きオブジェクトを作成したいと思うでしょう。

つまり、オブジェクトにリンクされたプロシージャに必要な余分な変数を格納する場所が必要です。

ちょうど例

答えて

0

、これは実際のコードではありません、注意してくださいあなたはデフォルトの動作でActionProcsを追加しないようにしたい場合は、この動作を持つグローバル(うまくいけばステートレス)ActionProcを指すことができます。継承されたクラスを上書きし、非デフォルト動作のコンストラクタにActionProcを渡して上書きすることができます。

ところで、あなたのコードは、GOFのbridgeデザインパターンに似ています。

+0

そのように私はそれらを追加する代わりにActionProcsに向けることができるようにしたいと問題は彼らが状態を持っていることです – ColmanJ

+0

それはあなたが "それらを追加する代わりにActionProcsに指示する"しかし、彼らは国家を持っているので、それらを追加する理由があるようです。 – stefaanv

+0

私は指し示すことによって、同じポインタを持つ複数のオブジェクトを意味するので、実際には同じオブジェクトに指示します。今のようなものではなく、彼らは行動手続きにも向いていますが、各オブジェクトには独自のものがあります。 – ColmanJ

0

オブジェクト自体に状態を格納することを検討してください。

class Object { 
    std::map<UINT32 id, bool variable> mBoolStates; 
    std::map<UINT32 id, UINT32 variable> mUINTStates; 

    ActionProc* pAP; 
}; 

ユーザーは、オブジェクトに必要な状態を追加して、Actionクラスのインスタンスで取得できます。 (州のコレクションを提供するより良い方法があるかもしれない)。