共享一些共同处理链的不同处理方法的设计模式

时间:2014-01-20 18:01:26

标签: java c++ design-patterns

我有一个与设计模式有关的问题。假设现在我想以不同的方式分析输入数据。我想一个漂亮的想法应该是不同的方法可以被视为不同的类。因为这些方法在处理链方面有一些共同点。例如,每种方法首先从媒体读取数据,然后进行某种规范化。分析完成后,应将结果写入文件。因此,当我为不同的处理方法设计类时,我首先为所有方法设计一个基类:

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_datawrite_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()
    {
     }
}

现在我的问题是:它是一种正确的设计策略吗?是否有智能方法在层次结构类结构中定义不同的处理方法?谢谢。

2 个答案:

答案 0 :(得分:1)

您可以考虑创建单独的接口Reader,Normalizer,Processor和Writer。特别是对于可测试性,这将允许您模拟读取和写入(假设您在内存中创建一些数据而不是单元测试)。创建一个导演或工作流类,它采用这些单独的组件并将它们一起使用。

答案 1 :(得分:1)

如果我理解正确的话,您不应该将输出实现细节放入继承中,因为它已经用于分离输入数据的不同算法。相反,您应该将输出实现逻辑移动(封装)到另一个类层次结构中。否则,您最终可能会创建许多仅由输出实现不同的子类,但具有相同的分析算法。使用实现类层次结构,您可以将不同的实现与不同的算法结合起来。

简而言之,Bridge pattern正是您所寻找的。