我在为以下场景找到简单而优雅的设计时遇到了麻烦。类Worker
使用模板类Helper
做一些工作。在简单的场景中,它看起来像这样:
template<typename T>
class Helper {
public:
void Help(T data) : m_data(data) {} //NOTICE: Copy
T const& Data() const { return m_data; }
T m_data;
}
class SimpleWorker {
public:
SimpleWorker() : m_helper(SimpleData()) {} // non-temp used in reality
void DoWork()
{
m_helper.help();
}
Helper<SimpleData> m_helper;
}
当模板参数更复杂并且与工人的业务领域相同时,事情对我来说变得复杂。工作人员需要使用帮助程序,但它还需要在数据对象上调用一些帮助程序甚至不知道的方法(在此设计中)。就像是:
template<typename T>
class Helper {
public:
Helper(T data) : m_data(data) {} //NOTICE: Copy
T const& Data() const { return m_data; }
T m_data;
}
class ComplexWorker {
public:
ComplexWorker() : m_helper(ComplexData()) {} // non-temp used in reality
void DoWork()
{
m_helper.help();
m_helper.GetData().DoSomethingComplexNotConst(); // <-------------
}
Helper<ComplexData> m_helper;
}
明显的问题是我不能在Data()
结果上调用 not const 函数。制作Data()
非常量似乎是一个坏主意,因为Helper
它也用于不同的上下文中。我的目标是找到一种优雅的方式来ComplexData
使用它的成员函数进行更改,ComplexWorker
首先ComplexData
需要更改,以便Helper
可以继续使用更改后的数据。
编辑:更改Helper
构造以复制提供的数据以更好地类似于实际流程