我的类的OutputPolicy有时会转到static / singleton对象,有时会转到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实例。所以我要么必须从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来产生outout。有时这些消息应该发送到Socket,有时它们应该由AlgoImp2处理。
此决定将在编译时进行。将会有许多Algo各自做不同的事情。好像我正在尝试做某种面向方面的东西。
问题:
通过将Base类设为策略,是否可以将Base类设为单例或普通对象?有这样的设计模式吗?也许某种工厂?
感谢您的帮助。
答案 0 :(得分: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*
类:如果在编译时给出输出策略 - 将所有这些类模板clasess,并将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;
};