哪种方法只为一个类实现多个订单关系?我对Strategy Pattern有一个想法,但我不确定这是个好主意。如果没有最好的方法,为什么?
答案 0 :(得分:1)
创建一个仿函数类并使用您要使用的订单关系初始化一个成员。让operator()
使用该成员来决定两个操作数的排序。
class Ordering
{
public:
Ordering(int method) : _method(method) {}
bool operator()(const MyObject & first, const MoObject & second) const
{
switch(_method)
{
case 0:
return first.name < second.name;
case 1:
return first.age < second.age;
// ...
}
}
int _method; // an enum would be better
};
std::sort(myobjs.begin(), myobjs.end(), Ordering(selected_method));
答案 1 :(得分:0)
我认为策略是一种更好的方式,我不太确定开关结构是个好主意(想象一下,1000个比较方法在一个开关中......太重了,不是吗?)
所以让A,一个需要方法比较的类。
我建议为每个方法创建一个类,该实例将是A的组件。
例如:
class A{
private:
//Some attributes
Comparator<A> comp_;
public:
//Some methods (including constructor)
bool operator()(const MyObject & first, const MoObject & second) const
{
return comp_.compare(first,second);
}
void setComparator(Comparator<A>& comp){
comp_ = comp;
}
}
//Forgot the syntax about template. So there is a template with one parameter
class Comparator{
public:
//Constructor
//To overwrite on subclasses
virtual bool compare(T& first, T& second) = 0;
}
使用该配置,您可以轻松添加方法,无需修改A,只需在程序执行的任何时刻设置正确的比较器。