码迷,mamicode.com
首页 > Web开发 > 详细

PHP设计模式之策略模式

时间:2015-07-12 14:17:18      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:模式   依赖   php   策略模式   

1.概念

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

2.功能

使用策略模式实现Ioc, 依赖倒置, 控制反转

3.举例

假如一个电商网站系统,针对不同的人群要跳转到不同的商品类目,并且所有广告位展示不同的广告

4.要解决的问题

1.不会因为上下文的改变而改变代码(传统都是使用 if else 来判断)
2.如果新增加一种类型的用户,只需要增加一种策略就好了,不需要在代码中 if else 里面在继续添加逻辑
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[‘famale‘])) {
    $strategy = new MaleUserStrategy();
}
//使依赖关系反转,最终执行在使用关系绑定,输出结果(解决了传统写法的耦合问题)
$page->setStrategy($strategy);
$page->index();

版权声明:本文为博主原创文章,未经博主允许不得转载。

PHP设计模式之策略模式

标签:模式   依赖   php   策略模式   

原文地址:http://blog.csdn.net/wjc19911118/article/details/46849703

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!