课程名称:大话PHP设计模式
课程章节:适配器模式
课程讲师:Rango
课程内容:
为什么要使用策略模式
- 假如一个网站,针对不同等级的用户显示不同的内容,那么显示内容的时候就需要先使用if判断用户等级,增加新的用户等级后需要在原代码的基础上新增判断,需要修改原来的核心代码,这是大忌。而策略模式则解决了这个问题,实现定义好每个用户等级的策略,在使用时判断用户等级再实例化不同的策略来使用
具体实现
该实例中的
Imooc\Loader.php
文件为框架加载文件,不是策略模式中的文件
该实例演示的是网站针对男女两种显示不同的广告和分类,有男、女两个策略
-
代码目录结构
-
Imooc\FemaleUserStrategy.php
<?php
namespace Imooc;
// 针对女性用户的策略
class FemaleUserStrategy implements UserStrategy
{
public function showAd()
{
echo '2022新款女装';
}
public function showCategory()
{
echo '女装';
}
}
- Imooc\MaleUserStrategy.php
<?php
namespace Imooc;
// 针对男性用户的策略
class MaleUserStrategy implements UserStrategy
{
public function showAd()
{
echo 'Iphone';
}
public function showCategory()
{
echo '电子产品';
}
}
- Imooc\Loader.php
<?php
namespace Imooc;
class Loader
{
static public function autoload($class) {
require BASEDIR . '/' . str_replace('\\', '/', $class) . '.php';
}
}
- Imooc\UserStrategy.php
<?php
namespace Imooc;
interface UserStrategy
{
public function showAd();
public function showCategory();
}
- index.php
<?php
define('BASEDIR', __DIR__);
include BASEDIR . '/Imooc/Loader.php';
spl_autoload_register('\\Imooc\\Loader::autoload');
class Index
{
/**
* @var \Imooc\UserStrategy
*/
private $strategy;
public function run()
{
echo '-------------------------' . PHP_EOL;
echo 'ShowAd:';
echo $this->strategy->showAd() . PHP_EOL;
echo '-------------------------' . PHP_EOL;
echo '-------------------------' . PHP_EOL;
echo 'showCategory:';
echo $this->strategy->showCategory() . PHP_EOL;
echo '-------------------------' . PHP_EOL;
}
public function setStrategy(\Imooc\UserStrategy $strategy)
{
$this->strategy = $strategy;
}
}
$obj = new Index;
/*
打开$female变量模拟用户是女性用户,打开$male变量模拟用户是男性用户
*/
//$female = 1;
$male = 1;
if (isset($female)) {
$strategy = new \Imooc\FemaleUserStrategy;
} elseif (isset($male)) {
$strategy = new \Imooc\MaleUserStrategy;
}
$obj->setStrategy($strategy);
$obj->run();
运行上面的index.php
代码,当用户为女性时会输出
-------------------------
ShowAd:2022新款女装
-------------------------
-------------------------
showCategory:女装
-------------------------
当用户为男性时会输出
-------------------------
ShowAd:Iphone
-------------------------
-------------------------
showCategory:电子产品
-------------------------
课程收货
此模式的应用非常广泛,在很多产品的常用功能中都适合使用该模式来实现