1

私のクラスのOutputPolicyは、静的/シングルトンオブジェクトに移動することもあれば、1対1のオブジェクトに移動することもあります。

英語で説明できるかどうかわからないので、疑似コードでの望ましい動作は次のとおりです。

template< 
    class Algo,
    template<class> OutputPolicy
>
class AlgoBase : Algo, OutputPolicy<Algo>
{
};

class AlgoImp
{
public:
    AlgoImp(string topic) {} 
    void OnData(
    {
        cout << " AlgoImp::OnData";
        if ( .... ) 
            NewMsg(msg);
    }
};

class AlgoImp2
{
public:
    AlgoImp2(string topic) {} 
    void OnData(
    {
        cout << " AlgoImp2::OnData";
        if ( .... ) 
            NewMsg(msg);
    }
};

AlgoImp :: OnDataは、いくつかの処理を実行し、NewMsgを呼び出します。NewMsg()呼び出しの実装を切り離そうとしています。

template < class T>
class OutMessageQueueTcp
{
    void NewMsg(string in)
    {
        //Should be a signgleton or static
        cout << " OutMessageQueueTcp::NewMsg";
    }
};

OutputPolicyがOutMessageQueueTcp(上記)の場合、OutputPolicyのインスタンスは1つだけである必要があります。したがって、シングルトンから派生するか、どこかで静的変数を使用する必要があります。

template <class T>
class OutMessageAsInput : AlgoBase<AlgoImp2, OutMessageQueueTcp>
{ 
    void NewMsg(string in)
    {
        cout << " OutMessageAsInput::OnData";
        AlgoBase<AlgoImp2, OutMessageQueueTcp>::NewMsg(in);
    }
};

OutputPolicyがOutMessageAsInput(上記)の場合、outは姉妹オブジェクトへの入力になり、OutMessageQueueTcpに送信されます。

これがメインです。

main 
{
    AlgoBase<AlgoImp, OutMessageAsInput> myalgo1;
    myalgo1.OnData("hi");
}

そして私の希望する出力:

AlgoImp::OnData
OutMessageAsInput::NewMsg 
AlgoImp2::OnData
OutMessageQueueTcp::NewMsg

私が実際に持っているのは、AlgoImpオブジェクトのコレクションであり、それぞれに独自のトピックとデータがあります。AlgoImpは、NewMsgを呼び出すことによってoutoutを生成します。これらのメッセージをソケットに送信する必要がある場合もあれば、AlgoImp2で処理する必要がある場合もあります。

この決定はコンパイル時に行われます。多くのアルゴがそれぞれ異なることをしているでしょう。ある種のアスペクト指向のことをやろうとしているようです。

質問:

それをポリシーにすることで、Baseクラスをシングルトンまたは通常のオブジェクトにすることは可能ですか?このようなデザインパターンはありますか?多分ある種の工場?

助けてくれてありがとう。

4

1 に答える 1

2

物事を単純に保つために-OutputPolicyあなたのアルゴクラスレベルでは、単純なメソッドを持つ単純なクラスでなければなりません。もちろん、実際の実装クラスのシングルトンメソッドまたは静的メソッドを使用して実装できます。

template < class T>
class OutMessageQueueTcp
{
public:
    void NewMsg(string in)
    {
       impl.NewMsg(in);
    }
private:
   static OutMessageQueueTcpImpl<T> impl;
};

または:

template < class T>
class OutMessageQueueTcp
{
public:
    void NewMsg(string in)
    {
       OutMessageQueueTcpImpl<T>::NewMsg(in);
    }
};

クラスの場合Algo*:コンパイル時に出力ポリシーが指定されている場合-これらすべてのクラスをテンプレートクラスにし、OutputPolicyをStrategy-として扱います-それは(メンバー変数として)algoクラスに集約されます:

template <template <typename> class OutputPolicy>
class AlgoImp
{
public:
    AlgoImp(string topic) {} 
    void OnData(
    {
        cout << " AlgoImp::OnData";
        if ( .... ) 
            outputPolicy.NewMsg(msg);
    }
private:
   OutputPolicy<AlgoImp> outputPolicy;
};
于 2012-09-26T08:31:28.030 に答える