3.10 策略模式
策略模式(Strategy)把一组可互换的算法各自封装成对象,让它们可以在运行时自由替换。客户端持有一个策略接口,具体用哪种算法由注入的策略决定——而调用方式始终不变。
导航软件是绝佳例子:同样是“从 A 到 B”,可以走最快路线、最短路线或风景路线。下面的实验让你切换导航策略,看同一个起终点如何给出不同的时间/距离权衡。
正在加载交互实验...
用组合替换继承
java
interface RouteStrategy { Route build(Point a, Point b); }
class Navigator {
private RouteStrategy strategy; // 持有策略
void setStrategy(RouteStrategy s) { this.strategy = s; }
Route navigate(Point a, Point b) {
return strategy.build(a, b); // 委托给当前策略
}
}新增一种算法 = 新增一个策略类,Navigator 一行都不用改——这正是开闭原则的体现。下面的支付实验让你切换信用卡 / PayPal / 加密货币,看 pay() 走完全不同的流程。
正在加载交互实验...
正在加载概念检查...
策略 vs 模板方法
两者都在“让算法的一部分可变”,但手段相反:
- 策略用组合:把整个算法做成可注入对象,运行时整体替换。
- 模板方法用继承:父类固定骨架,子类重写个别步骤。
策略更灵活(运行时可换、可组合),模板方法更省事(共享骨架、复用代码)。
正在加载概念检查...
与一等函数的关系
在支持一等函数/lambda 的语言里,简单策略常常退化成“传一个函数”。比如 list.sort(comparator)、给函数传一个回调,本质都是策略模式的轻量形态。规则复杂、需要状态或多方法时做成策略类;一次性的纯函数直接传 lambda。
正在加载本节练习...