🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
策略模式:定义一系列算法,将每个算法封装起来,并让它们可以互相替换,策略模式让算法的变化不会影响到使用它的客户。 策略模式是一种对象行为型模式。 步骤组成: * 抽象策略角色:策略类,通常由一个接口抽或象类实现 * 具体策略角色:封装了相关算法和行为,具体实现父类的共同方法 * 环境角色:接收保存实例,统一执行策略类接口方法 应用场景: * 多个类只区别在表现行为不同,在运行时动态选择具体要执行的行为 * 对客户隐藏具体算法的实现细节,彼此完全独立 * 需要在不同情况下使用不同算法 优点: * 策略模式提供了管理相关算法的办法,恰当使用继承可以把公共代码写入父类,避免重复代码 * 每个算法都有自己单独的类,可以通过自己单独的接口进行测试,简化了单元测试。 缺点: * 客户端必须知道所有的策略类,并自行决定使用哪一个策略类,因此,策略模式只适用于客户端知道所有算法或行为的情况下。 * 策略模式会造成很多策略类,每个具体策略类会产生一个新类。 ``` <?php /** * Interface Travel 抽象策略角色 * 约定具体方法 */ interface Travel { public function go(); } /** * Class byBus具体策略角色 * 乘公交 */ class byBus implements Travel { public function go() { echo '坐公交'; } } /** * Class byMetro 具体策略角色 * 乘地铁 */ class byMetro implements Travel { public function go() { echo '坐地铁'; } } /** * Class byTrain 具体策略角色 * 乘火车 */ class byTrain implements Travel { public function go() { echo '坐火车'; } } /** * Class Main 环境角色 */ class Main{ private $_strategy; private $_isChange = false; public function __construct(Travel $travel) { $this->_strategy = $travel; } /** * 改变出行方式 * * @param Travel $travel */ public function change(Travel $travel) { $this->_strategy = $travel; $this->_isChange = true; } public function goTravel() { $this->_strategy->go(); } } /** * 客户端使用 */ $strategy = new Main(new byBus()); // 乘公交 $strategy->goTravel(); // 乘地铁 $strategy->change(new byMetro()); $strategy->goTravel(); // 自驾车 $strategy->change(new byTrain()); $strategy->goTravel(); //运行结果:坐公交 坐地铁 坐火车 ```