浅谈设计模式之策略模式

策略模式(Strategy Pattern):定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy)。


应用场景:
我们有一个需求当一名用户访问我们网站,我们根据用户的性别不同推送不同的广告
在我们平时的代码中:会有许多IF...ELSE判断:如下:


class page{
     function index(){
         if(isset($_GET['woman'])){
            echo 'Lv包包';
         }else{
             echo 'iPhone X';
         }
     }
 }
$page->index();

一周后,突然老板给我们说,小王呀,这不行啊,我们的用户需要精确划分,我们要根据年龄不同来推送不一样的广告呀。然后我们就需要巴拉巴拉的修改着我们的代码IF...ELSEIF...ELSE,第二周,老板又说了,小王呀,咱们的广告我想了想换种其他的。这样就需要我们来回更换。这时候我们可以使用策略模式来面对不同的状况


  1. 定义公共的策略接口
    
    interface UserAd{
    public function showAd();    
    }
    

  1. 实现女人策略类与男人策略类

//男人策略类
class ManAd implements UserAd
{
    public function showAd()
    {
        echo 'Iphone X';
    }   
}

//女人策略类
class WomanAd implements UserAd
{
    public function showAd()
    {
        echo 'Lv 包包';
    }  
}


  1. 在主方法中根据实际场景调用实例化不同的策略类

 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 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!