我班级的 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 实例。所以我要么必须从单例派生,要么在某处使用静态变量。
template <class T>
class OutMessageAsInput : AlgoBase<AlgoImp2, OutMessageQueueTcp>
{
void NewMsg(string in)
{
cout << " OutMessageAsInput::OnData";
AlgoBase<AlgoImp2, OutMessageQueueTcp>::NewMsg(in);
}
};
如果 OutputPolicy 是 OutMessageAsInput(上图),则输出将成为姊妹对象的输入,然后将发送到 OutMessageQueueTcp。
这里是主要的。
main
{
AlgoBase<AlgoImp, OutMessageAsInput> myalgo1;
myalgo1.OnData("hi");
}
我想要的输出:
AlgoImp::OnData
OutMessageAsInput::NewMsg
AlgoImp2::OnData
OutMessageQueueTcp::NewMsg
我真正拥有的是 AlgoImp 对象的集合,每个对象都有自己的主题和数据。AlgoImp 将通过调用 NewMsg 生成输出。有时这些消息应该发送到一个 Socket,有时它们应该由 AlgoImp2 处理。
这个决定将在编译时发生。会有很多 Algo 各自做不同的事情。好像我正在尝试做一些面向方面的东西。
问题:
是否可以通过将基类设为策略来使基类成为单例对象或普通对象?有这样的设计模式吗?也许是某种工厂?
谢谢您的帮助。