介绍

  策略模式就是将特定的算法封装成类来适应特定的环境.解决了在有多种算法相似的情况下,使用 if...else... 所带来的复杂和难以维护.

优缺点

优点

  1. 算法可以自由切换.
  2. 避免使用多重条件判断.
  3. 扩展性好.

缺点

  1. 策略类会增多.
  2. 所有策略类都需要对外暴露.

演示

创建策略接口

  Tools/Strategy.php定义接口方法

<?php

namespace Tools;

interface Strategy
{
    // 展示
    function showSplit();
    // 展示直播
    function showLive();
}

具体策略实现

男性用户策略:Tools/ManStrategy.php

<?php

namespace Tools;

class ManStrategy implements Strategy
{
    public function showGoods()
    {
        echo '游戏电脑' . PHP_EOL;
    }

}

女性用户策略:Tools/WomanStrategy.php

<?php

namespace Tools;

class WomanStrategy implements Strategy
{
    public function showGoods()
    {
        echo '化妆品' . PHP_EOL;
    }
}

策略模式使用

设置策略模式方法:可以看到在对外接口showGoods方法中没有对不同策略的if...else判断.只需要直接调用策略提供的方法即可.如新增一种策略方法,只需要新增一个策略类并在策略发放中添加实例化即可.

class Index
{
    // 用于存储策略对象
    protected $strategy;
  
        // 推荐商品展示(被访问的接口)  
    public function showGoods()
    {
        $sex = isset($_GET['sex']) ? $_GET['sex'] : 1;
          // 只需向策略方法传递参数后即可直接调用里面方法
        $this->setStrategy($sex);
        $this->strategy->showGoods();
    }
  
    // 传入性别,更具性别不同实例化不同策略
    protected function setStrategy($sex)
    {
        if ($sex == 0) {
            $strategy = new \Tools\WomanStrategy();
        } else {
            $strategy = new \Tools\ManStrategy();
        }
        $this->strategy = $strategy;
    }
  
}

访问测试

男性推荐商品

image-20200308185514616.png

女性推荐商品

image-20200308185529026.png

Last modification:March 8th, 2020 at 07:01 pm