index.php 公共部分
define('BASEDIR',__DIR__);
include BASEDIR.'/Frame/Loader.php';
spl_autoload_register('\\Frame\\Loader::autoload');
Loader.php
<?php
namespace Frame;
class Loader
{
static function autoload($class)
{
require BASEDIR.'/'.str_replace('\\','/',$class).'.php';
}
}
一般的编码方法 在index.php中写入
<?php
define('BASEDIR',__DIR__);
include BASEDIR.'/Frame/Loader.php';
spl_autoload_register('\\Frame\\Loader::autoload');
class Page
{
//$_GET 传female为女性推荐展示
public function index()
{
if (isset($_GET['female'])) { //如果突然增加了几个展示类型,
//岂不是要写很多if else ,如果很多地方都有这种代码,修改起来真的太糟糕了,而且容易遗漏。
//女性
} else {
//男性
}
}
}
$page = new Page();
$page->index();
策略模式编码,首先声明一个UserStrategy接口来约束策略类
<?php
namespace Frame;
interface UserStrategy
{
public function showAd();//展示广告
public function showCategory();//展示分类
}
创建用于展示女性推荐展示化妆品的FemaleUserStrategy类文件实现UserStrategy接口
<?php
namespace Frame;
class FemaleUserStrategy implements UserStrategy
{
public function showAd()
{
echo "2019最火爆保水面膜";
}
public function showCategory()
{
echo "化妆品";
}
}
创建用于男性推荐展示电子产品的FemaleUserStrategy类文件实现UserStrategy接口
<?php
namespace Frame;
class MaleUserStrategy implements UserStrategy
{
public function showAd()
{
echo "1+ 11 plus 手机";
}
public function showCategory()
{
echo "手机";
}
}
在index.php中写入
<?php
define('BASEDIR',__DIR__);
include BASEDIR.'/Frame/Loader.php';
spl_autoload_register('\\Frame\\Loader::autoload');
class Page
{
protected $strategy;
public function index()
{
echo "AD:";//用于展示广告
$this->strategy->showAd();
echo "<br />";
echo "category:";//用于展示分类
$this->strategy->showCategory();
}
//设置策略对象
public function setStrategy(\Frame\UserStrategy $strategy)
{
$this->strategy = $strategy;
}
}
$page = new Page();
if (isset($_GET['female'])) {//女性
$strategy = new \Frame\FemaleUserStrategy();
} else {//男性
$strategy = new \Frame\MaleUserStrategy();
}
$page->setStrategy($strategy);
$page->index();
如果在增加若干个类型展示,其实主体的Page类的index方法不用改动,只需要在下面做一次if else 判断,创建一个新的策略类就可以实现了,降低了代码的耦合度、维护成本。