c++ - 在类堆栈之间交换数据

标签 c++ oop c++11 design-patterns

假设我们有一堆链接类。伪代码:

template<class CMyLevelHigher, class CMyLevelLower>
class CMyLevel 
{
public:
    CMyLevel(CMyLevelHigher* t_higher, CMyLevelLower* t_lower)
        :   m_higher(t_higher),
            m_lower(t_lower) 
    {
        // ...
    }

    void ProcessInHigher(/* data */) 
    {
        // ...

        if (m_higher != nullptr) {
            m_higher->ProcessInHigher(/* data */);
        }

        // ...
    }

    void ProcessInLower(/* data */) 
    {
        // ...

        if (m_lower != nullptr) {
            m_lower->ProcessInLower(/* data */);
        }

        // ...
    }

private:
    CMyLevelHigher* m_higher{ nullptr };
    CMyLevelLower* m_lower{ nullptr };
}

它们的目的是处理数据并将它们移动到较低或较高的方向(类设计可能不正确,仅供引用)。例如,对于网络协议(protocol)栈抽象。

/* data */ 中的参数可以是任何类型,具体取决于当前级别的用途。

您是否知道实现此行为的任何设计模式或编程最佳实践?

最佳答案

您可以使用 Strategy Pattern .

在您的示例中,CMyLevelHigher 和 CMyLevelLower 都继承了一个新的基本抽象类 CMyLevelBase,这样

template < typename ARGS >
class CMyLevelBase {
public:
    virtual void Process(const ARGS& args) = 0;
};

struct Args { /* specific parameters */ };
class CMyLevelHigher : public MyLevelBase<Args> { ... };
class CMyLevelLower  : public MyLevelBase<Args> { ... };

template < typename ARGS >
class CMyLevel {
    ...
public:
    void ProcessInHigher(const ARGS& args) { m_higher->ProcessInHigher(args); }
    void ProcessInLower (const ARGS& args) { m_lower ->ProcessInHigher(args); }
private:
    CMyLevelBase<ARGS>* m_higher{ nullptr };
    CMyLevelBase<ARGS>* m_lower { nullptr };
};

通过使用策略模式,CMyLevel 变得独立于 CMyLevelHigher、CMyLevelLower 和 Args。因此本设计实现了ISP(接口(interface)隔离原则)和DIP(依赖倒置原则)。

关于c++ - 在类堆栈之间交换数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32182148/

相关文章:

c++ - Qt 和 C++ - 我自己的类和信号/槽

c++ - 模板可变参数和显式实例化

php - 在 PHP 中设置具有字符串属性名称的对象的属性

objective-c - 如何在类实现中区分两个协议(protocol)的相同方法名称?

C++:使用插入排序的程序崩溃

java - 让 Emacs 在缩进时对齐点运算符

algorithm - 为什么是 `copy_n` 、 `fill_n` 和 `generate_n` ?

C++:监视器和条件变量进程间

c++ - 仅获得部分输出

c# - 使用锦标赛括号查找最小数字