PHP设计模式之策略模式
1.概念
策略模式:将一组特定的行为和算法封装成类。以适应某些特定的上下文环境,这样的模式就是策略模式
2.功能
使用策略模式实现Ioc, 依赖倒置, 控制反转
3.举例
假如一个电商站点系统,针对不同的人群要跳转到不同的商品类目。而且全部广告位展示不同的广告
4.要解决的问题
1.不会由于上下文的改变而改变代码(传统都是使用
ifelse来推断)
2.假设新添加一种类型的用户,仅仅须要添加一种策略就好了,不须要在代码中ifelse里面在继续加入逻辑
3.不同的地方仅仅须要运行不同的策略就好了,这样就可以解决这个问题
4.从硬编码到解耦的使用
5.最基本的是攻克了程序中的分支逻辑
5.实战代码展示
5.1 声明策略的接口文件
interface UserStrategy {
    function showAd();
    function showCategory();
} 5.2定义女性用户的策略
class FemaleUserStrategy implements UserStrategy  {
    function showAd()
    {
        echo "2014新款女装";
    }
    function showCategory()
    {
        echo "服装";
    }
} 5.3定义男性用户的策略
class MaleUserStrategy implements UserStrategy  {
    function showAd()
    {
        echo "IPhone6";
    }
    function showCategory()
    {
        echo "电子产品";
    }
} 6. 页面展示与使用
class Page
{
    //保存策略对象
    protected $strategy;
    //首页信息输出
    function index(){
        //传统写法,与输出
        if (isset($_GET['famale'])) {
            echo '女性';
        }else if (isset($_GET['famale'])) {
            echo '男性';
        }
        //假设新增了业务逻辑后面会非常多的  if  else
        //策略模式的输出
        echo $this->strategy->showAd();
        echo '<br>';
        echo $this->strategy->showCategory();
    }
    //策略模式来解决,注冊策略
    function setStrategy(UserStrategy $strategy){
        $this->strategy = $strategy;
    }
}
//运行
$page = new Page;
//这里依据实际上下文的环境
if (isset($_GET['famale'])) {
    $strategy = new FemaleUserStrategy();
}else if (isset($_GET['male'])) {
    $strategy = new MaleUserStrategy();
}
//使依赖关系反转,终于运行在使用关系绑定,输出结果(攻克了传统写法的耦合问题)
$page->setStrategy($strategy);
$page->index(); 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号