用于排序逻辑的策略或因子模式

时间:2012-04-12 07:54:13

标签: php design-patterns

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

要求: 排序逻辑可以是

  1. 按字段1排序
  2. 按字段2排序
  3. 按字段1 +字段2 +字段3排序 还可以更多。 ![在此处输入图像说明] [1]
  4. 解 我想为所有可能的逻辑和它们上面的接口创建类。

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

    请帮我解决这个问题

3 个答案:

答案 0 :(得分:1)

战略模式或访客模式最适合这种情况。 这个要求非常普遍,所以我建议任何对类图有很好了解的人都可以在这里上传

答案 1 :(得分:1)

战略模式在这里是最好的,虽然it's Wikipedia article是一个很好的参考,但它不是一个好的初学者。

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

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);

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

答案 2 :(得分:0)

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

因此,从概念的角度来看,您有一个Comparator接口,其方法compare(a, b)可以返回其参数之间的比较结果。此接口非常简单,在大多数情况下回调函数就足够了。请查看usort函数以获取示例。

相关问题