【问题标题】:Does this implementation of the "Context Pattern" look ok? [closed]“上下文模式”的这种实现看起来不错吗? [关闭]
【发布时间】:2012-05-01 17:03:52
【问题描述】:

我有多个可能存在于数组中的处理单元,每个处理单元都有自己的参数。在建议为solution to another question 之后,我想使用 上下文模式 来传达每个处理单元的参数。但是,我无法在线找到该模式的简单 C++ 示例。我在下面做了一个简化的实现供您检查。代码可以正常工作和编译,但是我是否正确地实现了该模式?任何和所有关于样式改进的建议都将受到欢迎。

#include <iostream>
#include <sstream>

#include <map>

class cParamsContext
{      
     typedef std::map<std::string, float> myMap_t; //Make the return type of getter less wordy
     myMap_t paramMap;

public:              
    cParamsContext()
    {
        paramMap["a0"] = 1.f;
        paramMap["a1"] = 2.f;
    }

    myMap_t const& getMap() const {return paramMap;} //Return read-only alias   
};

class cProcessUnit
{
    float parameter;
    int id;

public:
    cProcessUnit(cParamsContext &contextObj, int id_) : parameter (0.f), id(id_)
    {
        std::stringstream idStream;
        idStream << id;

        std::string key = std::string( "a" + idStream.str() );

        if(contextObj.getMap().find( key ) != contextObj.getMap().end())        
            parameter = contextObj.getMap().find( key )->second; // https://stackoverflow.com/questions/10402354/using-overloaded-operator-via-an-accessor-function#10402452                 
    }

    float getParam() {return parameter;}
};


int main(int argc, char *argv[])
{
    cParamsContext contextObj;


    for (int nn=0; nn<3; nn++)
    {
        cProcessUnit temp(contextObj, nn);
        std::cout << "Processing unit "  << nn << " param = " << temp.getParam() << std::endl;
    }
}

此外,您能否建议我如何让每个类中的参数在参数映射发生变化时自行更新?

如果您感兴趣,输出看起来像这样。 . . .

Processing unit 0 param = 1
Processing unit 1 param = 2
Processing unit 2 param = 0

【问题讨论】:

  • 这应该继续进行代码审查。

标签: c++ design-patterns


【解决方案1】:

这看起来确实是一个有效的实现。它通过了你的测试吗?我没有以这种特殊方式使用上下文模式的经验,但对我来说确实很好。

至于更新值,我目前在分配给我的项目中做一些非常相似的事情,我正在使用Observer Pattern。在这种情况下,cParamsContext 将是 observable。我正在使用观察者模式的signal/slot / event/delegate 实现。到目前为止,它为我的任务创造了奇迹。

【讨论】:

  • 设置cParamsContext observable 的好主意。 +1
【解决方案2】:

看起来它可以正常工作,但这里有一些建议:

  1. 考虑使用性能更高的哈希映射/表。 Boost hast 一个,你可以看看。 std::map 在性能方面表现不错,但根据数据集,哈希表的性能可能更高。

  2. 考虑将值模板化,或者至少通过为每种类型和相应的 getter/setter 创建映射来允许不同的类型。像现在这样,使用的参数只能是float,但是如果以后需要不同的参数呢?

【讨论】:

  • 感谢您的建议,但请详细说明(1)std::map 有什么问题和(2)我在模板化什么值,这会给我带来什么好处?请明确。
猜你喜欢
  • 2019-11-20
  • 1970-01-01
  • 1970-01-01
  • 2015-07-23
  • 1970-01-01
  • 2011-10-02
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
相关资源
最近更新 更多