我有一个与设计模式有关的问题。假设现在我想以不同的方式分析输入数据。我想一个漂亮的想法应该是不同的方法可以被视为不同的类。因为这些方法在处理链方面有一些共同点。例如,每种方法首先从媒体读取数据,然后进行某种规范化。分析完成后,应将结果写入文件。因此,当我为不同的处理方法设计类时,我首先为所有方法设计一个基类:
class Base
{
private:
void read_data();
void normalize_data();
virtual void write_data()=0;
virtual void process_data()=0;
public:
bool run_the_method()
{
read_data();
normalize_data();
process_data();
write_data();
}
}
对于方法类,我应该做的是重新定义虚函数process_data
和write_data
。现在我唯一关心的是执行每种方法后的分析输出。尽管该方法的输入与方法无关,但该方法的输出可能不同。对于某些方法,它们的输出是图像;对于某些方法,它们的输出是向量,可以存储在文本文件中。这将影响函数process_data()
中的参数以及write_data()
函数。我能想到的是基于Base
类派生几个类。
class OutputImage:public Base
{
pulbic:
OutputImage():Base();
virtual void write_data() { // writing images to file};
virtual void process_data() = 0;
}
class OutputText:public Base
{
pulbic:
OutputImage():Base();
virtual void write_data() { // writing text to file};
virtual void process_data() = 0;
}
基本思想是,根据处理方法的输出格式,所有方法都可以从OutputImage
类或OutputText
类进一步派生。例如:
class ProcessMethod:public OutputText
{
public:
virtual void process_data()
{
}
}
现在我的问题是:它是一种正确的设计策略吗?是否有智能方法在层次结构类结构中定义不同的处理方法?谢谢。
答案 0 :(得分:1)
您可以考虑创建单独的接口Reader,Normalizer,Processor和Writer。特别是对于可测试性,这将允许您模拟读取和写入(假设您在内存中创建一些数据而不是单元测试)。创建一个导演或工作流类,它采用这些单独的组件并将它们一起使用。
答案 1 :(得分:1)
如果我理解正确的话,您不应该将输出实现细节放入继承中,因为它已经用于分离输入数据的不同算法。相反,您应该将输出实现逻辑移动(封装)到另一个类层次结构中。否则,您最终可能会创建许多仅由输出实现不同的子类,但具有相同的分析算法。使用实现类层次结构,您可以将不同的实现与不同的算法结合起来。
简而言之,Bridge pattern正是您所寻找的。