浅谈设计模式之策略模式
策略模式(Strategy Pattern):定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy)。
应用场景:
我们有一个需求当一名用户访问我们网站,我们根据用户的性别不同推送不同的广告
在我们平时的代码中:会有许多IF...ELSE
判断:如下:
class page{
function index(){
if(isset($_GET['woman'])){
echo 'Lv包包';
}else{
echo 'iPhone X';
}
}
}
$page->index();
一周后,突然老板给我们说,小王呀,这不行啊,我们的用户需要精确划分,我们要根据年龄不同来推送不一样的广告呀。然后我们就需要巴拉巴拉的修改着我们的代码IF...ELSEIF...ELSE
,第二周,老板又说了,小王呀,咱们的广告我想了想换种其他的。这样就需要我们来回更换。这时候我们可以使用策略模式来面对不同的状况
- 定义公共的策略接口
interface UserAd{ public function showAd(); }
- 实现女人策略类与男人策略类
//男人策略类
class ManAd implements UserAd
{
public function showAd()
{
echo 'Iphone X';
}
}
//女人策略类
class WomanAd implements UserAd
{
public function showAd()
{
echo 'Lv 包包';
}
}
- 在主方法中根据实际场景调用实例化不同的策略类
class Page
{
protected $category;
function index(){
$this->category->showAd();
}
//外面裸露的设置策略的方法
function setAd(\Lib\UserAd $category){
$this->category = $category;
}
}
$page = new Page();
if(isset($_GET['woman'])){
$ad = new \Lib\WomanAd();
}else{
$ad = new \Lib\ManAd();
}
$page->setAd($ad);
$page->index();
现在老板又来找小王了,对小王说,我们要根据这个策略投放广告,我们还要根据这个策略去推送不同的厂商,我们只需在我们原来的接口增加一个方法,然后在男人策略类与女人策略类去实现这个方法!不需要修改主方法。如有不对,望指正。:bowtie:
本作品采用《CC 协议》,转载必须注明作者和本文链接