1

我班级的 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 各自做不同的事情。好像我正在尝试做一些面向方面的东西。

问题:

是否可以通过将基类设为策略来使基类成为单例对象或普通对象?有这样的设计模式吗?也许是某种工厂?

谢谢您的帮助。

4

1 回答 1

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*类:如果在编译时给出了输出策略 - 使所有这些类模板类,并将 OutputPolicy 视为Strategy- keeo 它在您的算法类中聚合(作为成员变量):

template <template <typename> class OutputPolicy>
class AlgoImp
{
public:
    AlgoImp(string topic) {} 
    void OnData(
    {
        cout << " AlgoImp::OnData";
        if ( .... ) 
            outputPolicy.NewMsg(msg);
    }
private:
   OutputPolicy<AlgoImp> outputPolicy;
};
于 2012-09-26T08:31:28.030 回答