PHP实现的策略模式示例


Posted in PHP onMarch 20, 2019

本文实例讲述了PHP实现的策略模式。分享给大家供大家参考,具体如下:

个人觉得设计模式只有在实际应用中才能够慢慢的去熟悉,到最后做到心中有模式,事事有模式,哈哈

例如:一个电商首页,可以根据登陆用户的性别不同显示不同的内容,比如广告和商品类别。

传统方法:在程序内部使用多个if,else进行判断,这样很难维护,比如我想要再加入一个人妖用户!那么我就要在程序中再加入else if判断,这样写出来的程序看起来很乱,而且不易维护。

策略模式:实现的思想是这样的,创建一个接口,对于每个类别的用户创建一个类,分别去实现接口中的方法,在首页进行判断实例化哪个类。

代码如下:

接口文件UserStrategy.php

<?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';
  }
}
?>

告诫自己在以后的编程中多去考虑,熟能生巧。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP数据类型之整数类型、浮点数的介绍
Apr 28 PHP
叫你如何修改Nginx与PHP的文件上传大小限制
Sep 10 PHP
ThinkPHP表单自动验证实例
Oct 13 PHP
支持中文、字母、数字的PHP验证码
May 04 PHP
php+ajax 实现输入读取数据库显示匹配信息
Oct 08 PHP
Smarty简单生成表单元素的方法示例
May 23 PHP
php+Memcached实现简单留言板功能示例
Feb 15 PHP
PHP PDOStatement::setFetchMode讲解
Feb 03 PHP
Yii2框架配置文件(Application属性)与调试技巧实例分析
May 27 PHP
PHP中非常有用却鲜有人知的函数集锦
Aug 17 PHP
PHP利用缓存处理用户注册时的邮箱验证,成功后用户数据存入数据库操作示例
Dec 31 PHP
阿里云服务器搭建Php+Apache运行环境的详细过程
May 15 PHP
PHP实现数组和对象的相互转换操作示例
Mar 20 #PHP
Laravel5.4框架使用socialite实现github登录的方法
Mar 20 #PHP
PHP工厂模式的日常使用
Mar 20 #PHP
PHP函数积累总结
Mar 19 #PHP
PHP与Perl之间知识点区别整理
Mar 19 #PHP
PHP后台备份MySQL数据库的源码实例
Mar 18 #PHP
PHP5中使用mysqli的prepare操作数据库的介绍
Mar 18 #PHP
You might like
php adodb连接带密码access数据库实例,测试成功
2008/05/14 PHP
MySQL 日期时间函数常用总结
2012/06/12 PHP
php教程之魔术方法的使用示例(php魔术函数)
2014/02/12 PHP
PHP定时更新程序设计思路分享
2014/06/10 PHP
php文件操作相关类实例
2015/06/18 PHP
jquery创建并行对象或者合并对象的实现代码
2012/10/10 Javascript
javascript设计模式之解释器模式详解
2014/06/05 Javascript
javascript中的altKey 和 Event属性大全
2015/11/06 Javascript
vue组件实例解析
2017/01/10 Javascript
canvas仿iwatch时钟效果
2017/03/06 Javascript
微信小程序之网络请求简单封装实例详解
2017/06/28 Javascript
分享Bootstrap简单表格、表单、登录页面
2017/08/04 Javascript
js中this对象用法分析
2018/01/05 Javascript
详解JavaScript中的数组合并方法和对象合并方法
2018/05/11 Javascript
vue 扩展现有组件的操作
2020/08/14 Javascript
angular8.5集成TinyMce5的使用和详细配置(推荐)
2020/11/16 Javascript
Python中操作符重载用法分析
2016/04/29 Python
Python实现爬取需要登录的网站完整示例
2017/08/19 Python
Python实现小数转化为百分数的格式化输出方法示例
2017/09/20 Python
python如何实现反向迭代
2018/03/20 Python
Python logging模块用法示例
2018/08/28 Python
python实现nao机器人身体躯干和腿部动作操作
2019/04/29 Python
给大家整理了19个pythonic的编程习惯(小结)
2019/09/25 Python
Python ORM编程基础示例
2020/02/02 Python
Python图像阈值化处理及算法比对实例解析
2020/06/19 Python
html5本地存储_动力节点Java学院整理
2017/07/12 HTML / CSS
全天然狗零食:Best Bully Sticks
2016/09/22 全球购物
澳大利亚连衣裙和女装在线:Esther
2017/11/11 全球购物
美国唇部护理专家:Sara Happ
2019/06/19 全球购物
中学生学习生活的自我评价
2013/10/26 职场文书
绿化工程实施方案
2014/03/17 职场文书
党支部对照检查材料
2014/08/25 职场文书
2016年企业先进员工事迹材料
2016/02/25 职场文书
Spring实现内置监听器
2021/07/09 Java/Android
Win10防火墙白名单怎么设置?Win10添加防火墙白名单方法
2022/04/06 数码科技
Python爬取奶茶店数据分析哪家最好喝以及性价比
2022/09/23 Python