PHP设计模式之策略模式

今天和大家来讨论下策略模式,策略模式的定义是,将多个算法族封装起来,让它们之间可以互相替换。说的通俗一点就是说,一件事可以有多种解决办法,比如我们系统中经常会用到的支付,支付现在主要有支付宝、微信和网银,我们可以选择其中任意一种方法。

我们从如何追靓女来说说策略模式。小A最近遇到一个心动的女生,苦于不知道如何表达,故请教了前辈大Z。大Z告诉小A追女孩的方式太多了,不知道你适合哪一种。比如直奔主题,或者渐进式等等。

首先看下UML类图(没找到好的工具,手动画的)

<?php

namespace app\strategy;

interface ChaseGirlType
{
  public function type ();
}
<?php

namespace app\strategy;

class ChaseGirlDirect implements ChaseGirlType
{
  public function type ()
  {
      echo '我喜欢你,做我女朋友吧';
  }
}
<?php

namespace app\strategy;

class ChaseGirlGradual implements ChaseGirlType
{
  public function type()
  {
      echo '美女,可以认识下加个微信吗?';
  }
}
<?php

namespace app\strategy;

class ChaseGirl
{
  private $chaseGirlType = null;

  public function __construct(ChaseGirlType $chaseGirlType)
  {
      $this->chaseGirlType = $chaseGirlType;
  }

  public function ChaseGirl ()
  {
      $this->chaseGirlType->type();
  }
}
<?php

namespace app\strategy;

require '../../vendor/autoload.php';

// 小明追女孩采用直接式
echo '小明追女孩'.PHP_EOL;
$chaseGirl = new ChaseGirl(new ChaseGirlDirect());
$chaseGirl->ChaseGirl();

echo PHP_EOL. '============='.PHP_EOL;

// 小周追女孩
echo '小周追女孩'.PHP_EOL;
$chaseGirl = new ChaseGirl(new ChaseGirlGradual());
$chaseGirl->ChaseGirl();

过了一段时间后,小H来请教前辈大Z,问有没有更好的方法,感觉这两种都不太适合我。前辈说方法太多了,给你再传授一种,去捉弄她引起她的注意。那么我们只要新加入一个类,实现新的方法即可

<?php

namespace app\strategy;

class ChaseGirlTease implements ChaseGirlType
{
   public function type()
  {
       echo '捉弄她,引起她的注意';
  }
}