手记

【九月打卡】第7天 设计模式之策略模式

课程名称:大话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:电子产品
-------------------------

课程收货

此模式的应用非常广泛,在很多产品的常用功能中都适合使用该模式来实现

0人推荐
随时随地看视频
慕课网APP