php设计模式(10)广告分男女-策略模式

2017-03-17 01:08:24 admin ...

前言:

我们一起聊完了关于创建型的设计模式,共说了工厂模式、单例模式、原型模式和策略模式这四种,今天我们开始一起聊一聊关于行为型设计模式-策略模式。

内容概要:

1、什么是策略模式

2、怎么实现策略模式

3、示例代码

4、策略模式和简单工厂模式的区别。

一、什么是策略模式

单从名字上我们其实也可以了解各大概:所谓策略,就是多个预备方案,根据环境的不同,选择不同的策略(方法)。

按照我们的习惯,举个例子:

我曾经接过一个搭建电商网站的活,其中有一个需求,用户首页,弹出框问顾客的性别,然后根据顾客选择的性别,在某些广告位置推荐相应性别的广告产品。

这是后我们就会用到策略模式。

策略:两个,男士广告产品,女性广告产品

环境:用户输入性别

结果:选择帅哥,广告位显示男士产品;选择美女,广告位现实女士产品。

二、怎么实现策略模式

先看策略模式的UML图:

我们一起来分析一下:

1、我们需要有一个策略接口,它可以规范每一个策略需要实现的方法。

2、我们需要有个调用的类,实现两个功能,一是接收环境参数,二是实例化策略对象。

3、客户端需要传递环境参数。

晕,这不是简单工厂模式嘛?!别着急,我们一会再讨论两者的区别。

三、示例代码

策略代码的实现比较长一些,我分几个地方给大家展示。

/************************************************************
** @Description: php设计模式之策略模式
** @Author: haodaquan
** @Date:   2017-03-17 00:11:24
** @Last Modified by:   haodaquan
** @Last Modified time: 2017-03-17 00:47:41
*************************************************************/

#用户广告接口
interface IUserAd
{
    function showAd();
    function showCategory();
}

#女士广告策略
class FemaleUserStrategy implements IUserAd
{
    function showAd(){
        echo "最新女装<br />";
    }

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

#男士广告策略
class MaleUserStrategy implements IUserAd
{
    function showAd(){
        echo "最新男装<br />";
    }

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

#策略
class Strategy
{
    protected $Strategy;

    function index()
    {
        $this->Strategy->showAd();
        $this->Strategy->showCategory();
    }

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

#使用时,使用一下代码:
$stra = new Strategy();
if(isset($_GET['female']))
{
     $strategy = new FemaleUserStrategy();
}else
{
     $strategy = new MaleUserStrategy();
}

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

我们可以访问
http://localhost/strategy.php
得到如下结果:

最新男装
男装

这和我们预期的是一样的。不过这个代码还可以再优化一下,比如在60行开始,我们可以采用其他方式,减少ifelse的判断,增加代码的性感美观程度。

四、策略模式和简单工厂模式的区别

1、策略模式是根据对象方法来实现业务的分离。简单工厂采用的实例化对象的方式实现业务的分离。

2、工厂模式属于创建对象型的模式 ,它关注对象创建,提供创建对象的接口. 让对象的创建与具体的使用客户无关。

策略模式是对象行为型模式 ,它关注行为和算法的封装 。它定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换。使得算法可独立于使用它的客户而变化

相似文章