基于C ++策略的设计....基于模板参数,基类是单例还是不单元。

时间:2012-09-26 04:32:23

标签: c++ design-patterns template-meta-programming policy-based-design

我的类的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类设为单例或普通对象?有这样的设计模式吗?也许某种工厂?

感谢您的帮助。

1 个答案:

答案 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;
};