介绍
策略模式就是将特定的算法封装成类来适应特定的环境.解决了在有多种算法相似的情况下,使用 if...else...
所带来的复杂和难以维护.
优缺点
优点
- 算法可以自由切换.
- 避免使用多重条件判断.
- 扩展性好.
缺点
- 策略类会增多.
- 所有策略类都需要对外暴露.
演示
创建策略接口
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;
}
}
访问测试
男性推荐商品
女性推荐商品