私のクラスの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クラスをシングルトンまたは通常のオブジェクトにすることは可能ですか?このようなデザインパターンはありますか?多分ある種の工場?
助けてくれてありがとう。