我的类的OutputPolicy有时会转到静态/单个对象,有时会转到1-to-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实例。因此,我要么必须从Singleton派生,要么在某个地方使用静态变量。
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生成中断。有时,这些消息应发送到Socket,有时应由AlgoImp2处理。
该决定将在编译时发生。会有很多Algo各自做比较事情。似乎我正在尝试做某种面向方面的东西。
问题:
通过制定策略,可以使基类成为单例对象还是普通对象?是否有类似这样的设计模式?也许某种工厂?
谢谢您的帮助。
最佳答案
为了使事情简单-在算法类级别的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
-将其聚合(作为成员变量)在您的算法类中:template <template <typename> class OutputPolicy>
class AlgoImp
{
public:
AlgoImp(string topic) {}
void OnData(
{
cout << " AlgoImp::OnData";
if ( .... )
outputPolicy.NewMsg(msg);
}
private:
OutputPolicy<AlgoImp> outputPolicy;
};