我正在努力提高我的设计模式技能,所以请对我很轻松:)在我的工作中,我经常要处理定义算法的问题,但它正在处理的数据结构是不同的。
让我们说我有一个Counter类,它的责任是只要计算符合某些标准的项目(大大简化)。这些项目可能具有不同的结构,例如:
感觉(对我来说)有一个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来解决这个问题,但这不是一个非常好的设计。也可以使用模板,但这会使代码更复杂,所以我想首先知道是否有任何设计模式可以用来实现我想要的。或许我对这个问题的解决方法是完全错误的,并且有一些简单的解决方案,我只是看不到?
谢谢!
答案 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)
最后我通过使用访问者模式解决了我的问题:)