PHP策略模式

Posted by 撒得一地 on 2016年2月2日 in PHP笔记

什么是PHP策略模式?策略模式,就是将一组特定的行为和算法封装成类,以适应某些特定的上下文环境,这种模式就是策略模式。

实际应用举例,假如一个电商网站系统,针对男性女性用户要各自跳转到不同的商品类目,并且所有广告位展示不同的广告。那么按传统的思路方法,我们一般可以选择两种方法。第一种方法是可以将这些针对男性、女性的查询方法写到一个类中,在该类中提供相对应的方法,每一个方法对应一个具体的查询方式。第二种方法是将这些查询封装在一个统一的方法中,通过if…else等条件判断来实现。上面陈述的这两种实现方法我们都可以称之为硬编码,这两种实现方法的坏处是当要新加另一种查询方法时,代码将越变越复杂,改动的地方比较多,维护较为困难。

根据上面的案例,下面用代码说明下策略模式的具体实现和使用。

首先,声明一个策略的接口文件,这个文件约定了策略有哪些行为(方法),如:

interface UserStrategy {
    function showAd();
    function showCategory();
}

下面定义具体的策略实现,定义一个女性行为策略:

class FemaleUserStrategy implements UserStrategy {
    function showAd()
    {
         echo "爆款女装";
    }

    function showCategory()
    {
         echo "女装";
    }    
}

下面再创建一个针对男性的策略:

class MaleUserStrategy implements UserStrategy {
    function showAd()
    {
         echo "大哥大手机";
    }

    function showCategory()
    {
        echo "电子产品";
    }    
}

按照传统方法,我们首页的代码可能会这样写:

class page
{
   function index()
   {
        if(isset($_GET['female']))
        {
         
        }elseif(..) {

        }  
    }
}

那么当我们要新增一个策略时,就要继续添加一个if..else条件判断,当策略越来越多时,可能会使得代码越来越冗长,越来越不好维护,下面介绍采用策略模式的方法:

class page
{
   protected $strategy;
   function index()
   {
       echo "AD:";
       $this->strategy->showAd(); 
       echo "<br/>";
       echo "Category:";
       $this->strategy->showCategory();   
    }

    function setStrategy(UserStrategy $strategy)
   {
       $this->strategy = $strategy;
    }
}

$page = new page;

if(isset($_GET['female'])) {
    $strategy = new FemaleUserStrategy();
} else {
    $strategy = new MaleUserStrategy();
}

$page->setStrategy($strategy);
$page->index();

这样,当我们要新增一个策略时,只要新加一个策略类,然后在调用策略时实例化该策略。这样使得代码更加耦合,而且易于维护。

策略模式除了实现分支逻辑处理外,还有一个非常重要的功能,是可以实现Ioc,即依赖倒置、控制反转。在上面的实例中,将page类和两个策略类(FemaleUserStrategy、MaleUserStrategy)关系进行反转,在page页面里面,并不用去具体定义所依赖的类,而是在层实例化策略类后再与page类进行绑定,这种模式在面向对象中经常用到。面向对象中一个很重要的思路就是解耦,如果两个类是互相依赖的关系,那么他们之间就是紧耦合的关系,这样不利于我们去替换其中的某一个类。

使用策略模式,将两个类进行解耦,这样很方便我们去替换其中某一个类。

标签:

上一篇:

下一篇:

相关推荐

网站地图|XML地图

Copyright © 2015-2024 技术拉近你我! All rights reserved.
闽ICP备15015576号-1 版权所有©psz.