应用哪种设计模式?

时间:2016-05-13 22:08:33

标签: oop design-patterns

我正在努力提高我的设计模式技能,所以请对我很轻松:)在我的工作中,我经常要处理定义算法的问题,但它正在处理的数据结构是不同的。

让我们说我有一个Counter类,它的责任是只要计算符合某些标准的项目(大大简化)。这些项目可能具有不同的结构,例如:

  • 如果计数器正在运行" text"如果项目的长度大于X
  • ,我只计算一个项目
  • 如果计数器正在运行"图像"如果项目是JPEG图像,我只计算一个项目。

感觉(对我来说)有一个AbstractItem类,计数器可以使用它,但是它也需要关联AbstractCriteria,因为每种类型的项目都以不同的方式评估标准

某种伪代码:

class Counter
{
  AbstractItemFactory factory; // initialized in constructor
  AbstractCriteria criteria;   // initialized in constructor
  DataProvider provider;       // initialized in constructor

  int count()
  {
    int result;

    while((Data data = provider.get()) != null)
    { 
      AbstractItem item = factory.create(data);
      if(criteria.match(item))
      {
        result++;
      }
    }
    return result;
  }
}

这里的问题是AbstractCriteria当然不知道如何处理AbstractItem。我知道可以通过在override match()方法中使用base-to-derived cast来解决这个问题,但这不是一个非常好的设计。也可以使用模板,但这会使代码更复杂,所以我想首先知道是否有任何设计模式可以用来实现我想要的。或许我对这个问题的解决方法是完全错误的,并且有一些简单的解决方案,我只是看不到?

谢谢!

2 个答案:

答案 0 :(得分:0)

KISS

template<typename T>
bool predicate(T const & val);

template<>
bool predicate<string>(string const & s) {
    return s.length() > 5;
}

template<>
bool predicate<Image>(Image const & i) {
    return i.format() == "JPEG";
}

template<class Iter>
iterator_traits<Iter>::difference_type count(Iter first, Iter last) {
    using element_type = decay<iterator_traits<Iter>::value_type>::type;
    return count_if(first, last, predicate<element_type>);
}

将它们放在命名空间中,或者如果你愿意,可以将它们作为计数器类的静态方法。

答案 1 :(得分:0)

最后我通过使用访问者模式解决了我的问题:)