设计模式之策略模式–配合工厂模式灵活替换不同算法实现
策略模式
是一种对可替换的算法或者业务逻辑进行封装,灵活替换的模式。
定义了算法家族并分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户端。
为什么要使用策略模式
策略模式是比较常用的模式了,很多情况下都会需要根据场景来替换不同的具体实现。
比如打折算法
,针对不同级别的用户进行不同的打折。
比如优惠券算法
,针对不同类型的优惠券使用不同的算法。
比如支付算法
,对接微信,支付宝等不同的支付渠道。
只要是同一种类型,但是有多种实现。就可以使用策略模式,策略模式一般和工厂模式搭配使用,通过工厂创建对应的策略对象供客户端使用。
php实现策略模式
首先定义一个接口或者父类,所有的策略继承父类.
class StrategySuper {
function getResult($money) {
}
}
接下来实现不同的具体策略。
/**
* 策略A
* 满减活动
*/
class StrategyA extends StrategySuper {
function __construct($man, $jian)
{
$this->man = $man;
$this->jian = $jian;
}
function getResult($money) {
if ($money >= $this->man) {
return $money -= $this->jian;
}
return $money;
}
}
/**
* 策略B
* 打折活动
*/
class StrategyB extends StrategySuper {
function __construct($zhe)
{
$this->zhe = $zhe;
}
function getResult($money) {
return $money * $this->zhe;
}
}
这时候客户端可以根据需要使用不同的策略,也可以创建一个策略工厂,通过工厂来创建策略。
/**
* 根据策略规则创建策略类
*
*/
class StrategyContext{
private $strategy;
function __construct(string $type)
{
switch($type) {
case 'manjian':
$this->strategy = new StrategyA(100,10);
break;
case 'dazhe':
$this->strategy = new StrategyB(0.5);
break;
}
}
function getMoney($money) {
return $this->strategy->getResult($money);
}
}
代码放在了我的github上面。