定义
策略模式(Strategy Pattern)定义了算法家族,分别封装起来,让它们可以互相替换,此模式让算法的变化不会影响到使用算法的客户,属于行为型模式。
代码示例
商城中常用到商品促销的模块,促销有多种方式,本质上是商品金额计算的算法。多种算法集合在一起怎么使用,客户端不需要关心,这也是下边的代码里选择将策略选择的代码放在了Context里进行管理,尽量减少客户端对对象的引用。
<?php
abstract class Promotion
{
abstract public function counter($money);
}
class Original extends Promotion
{
public function counter($money)
{
return $money;
}
}
class Discount extends Promotion
{
private $rate;
public function __construct($rate)
{
$this->rate = $rate;
}
public function counter($money)
{
return $money * $this->rate / 10;
}
}
class Context
{
public function usePromotion($promotion,$money,$rate = '')
{
switch($promotion){
case 'original':
$promotionModel = new Original();
echo $promotionModel->counter($money);
break;
case 'discount':
$promotionModel = new Discount($rate);
echo $promotionModel->counter($money);
break;
default:
$promotionModel = new Original();
echo $promotionModel->counter($money);
}
}
}
class DemoPattern
{
public function handle()
{
$context = new Context();
$context->usePromotion('original',996);
//打7折
$context->usePromotion('discount',996,7);
}
}
$demoPattern = new DemoPattern();
$demoPattern->handle();
总结
策略模式是用来封装算法的,减少算法使用者和算法之间的耦合,也减少客户端的各种 If...else 判定。
网友评论