策略模式是把算法,封装起来。使得使用算法和使用算法环境分离开来,当算法发生改变时,咱们之须要修改客户端调用算法,和增长一个新的算法封装类。好比超市收银,收营员判断顾客是不是会员,当顾客不是会员时候,按照原价收取顾客购买商品费用,当顾客是会员的时候,满100减5元。php
Cashier.phpgit
<?php namespace App\Creational\Strategy; class Cashier { private $cutomer; public function setStrategy(CustomerAbstract $customer) { $this->cutomer = $customer; } public function getMoney($price) { return $this->cutomer->pay($price); } }
CustomerAbstract.phpgithub
<?php namespace App\Creational\Strategy; abstract class CustomerAbstract { abstract public function pay($price); }
<?php namespace App\Creational\Strategy; class NormalCustomer extends CustomerAbstract { public function pay($price) { return $price; } }
<?php namespace App\Creational\Strategy; class VipCustomer extends CustomerAbstract { public function pay($price) { return $price - floor($price/100)*5; } }
测试代码
StrategyTest.php测试
<?php /** * 策略模式 * Class StrategyTest */ class StrategyTest extends \PHPUnit\Framework\TestCase { public function testCustomer() { $price = 100; $vipCutomer = new \App\Creational\Strategy\VipCustomer(); $normalCustomer = new \App\Creational\Strategy\NormalCustomer(); $cashier = new \App\Creational\Strategy\Cashier(); $cashier->setStrategy($vipCutomer); $this->assertEquals(95, $cashier->getMoney($price)); $cashier->setStrategy($normalCustomer); $this->assertEquals(100, $cashier->getMoney($price)); } }