【问题标题】:design pattern for different processing methods that share some common processing chains共享一些通用处理链的不同处理方法的设计模式
【发布时间】:2014-01-21 03:18:53
【问题描述】:

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

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

现在我的问题是:这是一个正确的类设计策略吗?有没有在层次类结构中定义不同处理方法的聪明方法?谢谢。

【问题讨论】:

    标签: java c++ design-patterns


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2011-03-12
        • 2012-12-22
        • 1970-01-01
        • 1970-01-01
        • 2021-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-25
        相关资源
        最近更新 更多