• 周蓬安.blog的博客—强国博客—人民网 2019-05-10
  • 紫光阁中共中央国家机关工作委员会 2019-05-10
  • 感触名家笔下的端午文化吃香粽原来可以这样文艺 2019-05-09
  • 追梦夺冠游行嘲讽詹皇 百万人面前穿订制T恤羞辱他 2019-04-27
  • 《瘟疫传说》:黑死病恐怖 姐弟在绝望中求生 2019-04-10
  • 陕西国防工业职业技术学院百名大学生志愿者敬老院慰问孤寡老人陕西国防工业职业技术学院百名大学生志愿者敬老院慰问-陕西教育新闻 2019-04-08
  • 西藏拉萨:新家园 新生活 2019-04-08
  • 尊重和保障宗教信仰自由的中国实践 2019-04-06
  • 一敬泯恩仇 俄罗斯队主帅这个动作太暖了 2019-03-20
  • 四大名著剧组首次同台忆往事 经典影视剧如何铸就? 2018-12-07
  • “天眼”凝望 探秘宇宙 2018-12-07
  • 0

    PHP策略模式

    Posted by 撒得一地 on 2016年2月2日 in PHP笔记
    国外稳定加速器推荐    Express | Vypr

    什么是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类进行绑定,这种模式在面向对象中经常用到。面向对象中一个很重要的思路就是解耦,如果两个类是互相依赖的关系,那么他们之间就是紧耦合的关系,这样不利于我们去替换其中的某一个类。

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

    标签:

    上一篇:

    下一篇:

    相关推荐

    发表评论

    电子邮件地址不会被公开。 必填项已用*标注

    2 + 4 = ?

    网站地图|广东快乐10分开奖直播

    Copyright © 2015-2019 广东快乐10分开奖直播 All rights reserved.
    闽ICP备15015576号-1,版权所有?psz.

  • 周蓬安.blog的博客—强国博客—人民网 2019-05-10
  • 紫光阁中共中央国家机关工作委员会 2019-05-10
  • 感触名家笔下的端午文化吃香粽原来可以这样文艺 2019-05-09
  • 追梦夺冠游行嘲讽詹皇 百万人面前穿订制T恤羞辱他 2019-04-27
  • 《瘟疫传说》:黑死病恐怖 姐弟在绝望中求生 2019-04-10
  • 陕西国防工业职业技术学院百名大学生志愿者敬老院慰问孤寡老人陕西国防工业职业技术学院百名大学生志愿者敬老院慰问-陕西教育新闻 2019-04-08
  • 西藏拉萨:新家园 新生活 2019-04-08
  • 尊重和保障宗教信仰自由的中国实践 2019-04-06
  • 一敬泯恩仇 俄罗斯队主帅这个动作太暖了 2019-03-20
  • 四大名著剧组首次同台忆往事 经典影视剧如何铸就? 2018-12-07
  • “天眼”凝望 探秘宇宙 2018-12-07
  • 河南省彩票幸运武林 快乐8 体彩7星彩最新开奖结果 北京pk10开奖直播 破解重庆幸运农场技巧 上海时时乐开奖号码 时时彩开奖结果 北京赛车平刷王 重庆时时彩骗局 体彩排列三走势图 中国福利彩票七乐彩 360彩票老时时彩 江西新时时彩投注技巧 天津时时彩官网遗漏 网赌北京pk10输的人 北京pk10网上骗局新闻