如何用策略模式实现表格的字母/数字排序?附非策略模式代码
用策略模式重构表格排序功能
我来帮你把这段表格排序代码改成策略模式的实现,这样你就能根据数据类型(字母/数字)灵活切换排序逻辑,代码也会更易维护和扩展!
首先,咱们先明确策略模式的核心思路:把不同的排序算法(字母排序、数字排序)封装成独立的策略类,然后用一个上下文类来统一调用这些策略,避免在代码里写一堆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
相关产品推荐
相关产品推荐

