<?php
//定义接口,我要展示广告和类别
interface UserStrategy
{
//显示广告的方法
public function showAd();
//显示类别的方法
public function showCategory();
}
?>
男性用户的具体显示MaleUserStrategy.php
<?php
//强制实现接口中的方法
class MaleUserStrategy implements UserStrategy
{
//男性用户登录后会显示iphone6s的广告
public function showAd()
{
echo 'Iphone6s';
}
//会显示电子产品类别
public function showCategory()
{
echo '电子产品啊';
}
}
?>
女性用户的具体显示FemaleUserStrategy.php
<?php
class FemaleUserStrategy implements UserStrategy
{
public function showAd()
{
echo '2016女装';
}
public function showCategory()
{
echo '女装';
}
}
?>
重点来了,创建首页文件Strategy.php
<?php
//如果我想使用上面那些类的话就需要一个文件一个文件的require,但我们可以使用一种方法来自动加载所需要的文件
//首先定义一个基本的文件路径,因为这些文件我都是放在一个文件夹下的
define('BASEDIR', __DIR__);
//载入一个自动require文件的文件,这里我写成Config.php
require 'Config.php';
//PHP提供的spl库,这我们就把需要的文件都加载进来了
//那么spl_autoload_register()是什么意思呢?其实就是,当程序运行碰到了没有定义的类的时候就会自动执行它里面的函数,所以就把文件加载近来了呀!
spl_autoload_register('Config::autoload');
class Strategy
{
//定义一个变量来存储策略
protected $_strategy;
//定义展示广告和类别的方法
public function index()
{
echo 'Ad:';
echo $this->_strategy->showAd();
echo '<br/>';
echo 'Category:';
echo $this->_strategy->showCategory();
}
//创建不同的策略
public function setStrategy($strategy)
{
$this->_strategy = $strategy;
}
}
//实例化对象
$strategy = new Strategy();
//如果$_GET['female']存在的话就显示女性用户的广告和类别--如果需要添加其它策略的时候只需要在这里加入判断条件就可以了,当然了还需要创建相应策略的类并且一定要去继承接口哦
if(isset($_GET['female']))
{
$people = new FemaleUserStrategy();
}
else
{
$people = new MaleUserStrategy();
}
//把对象传入到策略类里
$strategy = setStrategy($people);
//显示广告和类别--因为使用了策略模式,当我们需要新增加一个策略的时候这里就不需要修改了。
$strategy->index();
?>
自动引入文件Config.php
<?php
//这里大家可以看到,我的文件都是大写开头的,而且每个文件中只有一个类,并且这个类的名字是和文件名一样的,其实这是一种框架的规范,大家有兴趣的话可以查找一下,psr-0规范
class Config
{
//定义一个自动引入文件的方法
static function autoload($class)
{
//这里拼接我们需要引入文件的路径
require BASEDIR.'/'.$class.'.php';
}
}
?>