You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用策略模式实现表格的字母/数字排序?附非策略模式代码

用策略模式重构表格排序功能

我来帮你把这段表格排序代码改成策略模式的实现,这样你就能根据数据类型(字母/数字)灵活切换排序逻辑,代码也会更易维护和扩展!

首先,咱们先明确策略模式的核心思路:把不同的排序算法(字母排序、数字排序)封装成独立的策略类,然后用一个上下文类来统一调用这些策略,避免在代码里写一堆if-else判断。

步骤1:定义排序策略接口

首先创建一个所有排序策略都要实现的接口,规定排序方法的统一格式:

interface SortStrategy {
    public function sort(array $data, string $field): array;
}

步骤2:实现具体的排序策略类

接下来分别实现字母排序和数字排序的策略:

字母排序策略(处理字符串类型字段,比如name、cat)

class StringSortStrategy implements SortStrategy {
    public function sort(array $data, string $field): array {
        usort($data, function($a, $b) use ($field) {
            return strcmp($a[$field], $b[$field]);
        });
        return $data;
    }
}

数字排序策略(处理数字类型字段,比如price)

class NumberSortStrategy implements SortStrategy {
    public function sort(array $data, string $field): array {
        usort($data, function($a, $b) use ($field) {
            return (float)$a[$field] - (float)$b[$field];
        });
        return $data;
    }
}

步骤3:创建上下文类(表格排序器)

这个类负责持有当前使用的排序策略,对外提供统一的排序入口:

class TableSorter {
    private SortStrategy $strategy;

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

    // 切换策略的方法
    public function setStrategy(SortStrategy $strategy): void {
        $this->strategy = $strategy;
    }

    // 统一的排序方法
    public function sortTable(array $data, string $field): array {
        return $this->strategy->sort($data, $field);
    }
}

步骤4:使用重构后的代码

现在你可以轻松根据字段类型选择对应的排序策略了,比如用你提供的产品数组:

$products = [
    ['name' => "Carrot", 'id' => "V_001", 'cat' => "Vegetable", 'price' => "0.59"],
    ['name' => "Potato", 'id' => "V_002", 'cat' => "Vegetable", 'price' => "0.69"],
    ['name' => "Apple", 'id' => "F_001", 'cat' => "Fruit", 'price' => "1.29"],
    ['name' => "Banana", 'id' => "F_002", 'cat' => "Fruit", 'price' => "0.89"]
];

// 按名称(字母)排序
$sorter = new TableSorter(new StringSortStrategy());
$sortedByName = $sorter->sortTable($products, 'name');

// 切换策略,按价格(数字)排序
$sorter->setStrategy(new NumberSortStrategy());
$sortedByPrice = $sorter->sortTable($products, 'price');

// 输出结果示例
echo "按名称排序:<br>";
foreach ($sortedByName as $item) {
    echo $item['name'] . " - " . $item['price'] . "<br>";
}

echo "<br>按价格排序:<br>";
foreach ($sortedByPrice as $item) {
    echo $item['name'] . " - " . $item['price'] . "<br>";
}

为什么这样更好?

  • 扩展性强:如果以后需要添加新的排序方式(比如按ID排序、倒序排序),只需要新增一个实现SortStrategy的策略类就行,不用修改原有代码。
  • 代码更清晰:把排序逻辑从业务代码中抽离出来,避免了一堆if-else判断,可读性更高。
  • 灵活性高:可以在运行时动态切换排序策略,比如根据用户选择的排序字段自动切换对应的策略。

内容的提问来源于stack exchange,提问作者Elias

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:30:49