我的类的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;
};

08-26 19:27