1

我正在设计一个类图,我对如何使用排序逻辑感到困惑。

要求:排序逻辑可以

  1. 按字段排序1
  2. 按字段排序2
  3. 按 field1+field2+field3 排序,可以更多。![在此处输入图像描述][1]

解决方案我正在考虑为所有可能的逻辑创建类并在它们之上创建一个接口。

我应该使用哪种模式或工厂模式。

请帮助我

4

3 回答 3

1

策略模式在这里是最好的,虽然它的维基百科文章是一个很好的参考,但它不是一个好的初学者文章。

简单地说(忽略接口、类型检查等),您为每个潜在的排序算法创建单独的类,然后将其中一个排序类的实例传递给对象的构造函数,以便可以使用它。然后,您的主类将排序操作委托给传入的任何排序器,如下所示:

class mainthing {

    public function __construct($sorter) {
        $this->sorter = $sorter;
    }

    public function sort($stufftosort) {
        return $this->sorter->sort($stufftosort);
    }

}

class sorter {
    public function sort($stufftosort) {
        // sorting code here
    }

}

class differentsorter {
    public function sort($stufftosort) {
        // different sorting code here
    }

}

$thing = new mainthing(new sorter());
$thing->sort($somestuff);
$otherthing = new mainthing(new differentsorter());
$otherthing->sort($somestuff);

这个想法是,您可以混合和匹配不同的行为,而不是被束缚在严格的继承层次结构中。也许您还有其他关于这些类的内容应该有所不同,而不仅仅是排序 - 只需通过向构造函数传递一个可以提供该功能的对象来做同样的事情。

于 2012-04-12T10:16:55.740 回答
1

Strategy pattern or visitor pattern is best suited for this. this requirement is very common and so i suggest anyone having good knowledge of class diagram can upload it here

于 2012-04-12T08:50:13.880 回答
0

这里有两件事要考虑,排序算法本身和比较函数。您似乎在使用比较函数,这是一种只知道如何比较列表中的两个项目的策略,排序算法将使用它对列表进行排序。

因此,从概念的角度来看,您将拥有一个Comparator带有方法的接口,该方法compare(a, b)返回其参数之间的比较结果。这个接口很简单,在大多数情况下一个回调函数就足够了。以usort函数为例。

于 2012-04-12T12:57:49.807 回答