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版自动生成文章摘要
Jul 23 PHP
Windows下安装Memcached的步骤说明
Apr 25 PHP
如何用PHP实现插入排序?
Apr 10 PHP
PHP Session 变量的使用方法详解与实例代码
Sep 11 PHP
免费的ip数据库淘宝IP地址库简介和PHP调用实例
Apr 08 PHP
php+xml结合Ajax实现点赞功能完整实例
Jan 30 PHP
php计算一个文件大小的方法
Mar 30 PHP
php的crc32函数使用时需要注意的问题(不然就是坑)
Apr 21 PHP
Smarty3配置及入门语法
Feb 22 PHP
php可变长参数处理函数详解
Feb 22 PHP
PHPExcel实现表格导出功能示例【带有多个工作sheet】
Jun 13 PHP
PHP生成随机码的思路与方法实例探索
Apr 11 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
laravel实现Auth认证,登录、注册后的页面回跳方法
2019/09/30 PHP
JQuery textlimit 显示用户输入的字符数 限制用户输入的字符数
2009/05/14 Javascript
模仿JQuery sortable效果 代码有错但值得看看
2009/11/05 Javascript
Javascript 类与静态类的实现
2010/04/01 Javascript
23个超流行的jQuery相册插件整理分享
2011/04/25 Javascript
jquery焦点图片切换(数字标注/手动/自动播放/横向滚动)
2013/01/24 Javascript
纯JS实现五子棋游戏兼容各浏览器(附源码)
2013/04/24 Javascript
JavaScript字符串插入、删除、替换函数使用示例
2013/07/25 Javascript
在JavaScript中使用开平方根的sqrt()方法
2015/06/15 Javascript
深入解读JavaScript中的Hoisting机制
2015/08/12 Javascript
JavaScript动态添加事件之事件委托
2016/07/12 Javascript
基于Vue过渡状态实例讲解
2017/09/14 Javascript
基于对象合并功能的实现示例
2017/10/10 Javascript
开发Vue树形组件的示例代码
2017/12/21 Javascript
Vue-Router2.X多种路由实现方式总结
2018/02/09 Javascript
element-ui upload组件多文件上传的示例代码
2018/10/17 Javascript
Nuxt的动态路由和参数校验操作
2020/11/09 Javascript
uniapp开发小程序实现滑动页面控制元素的显示和隐藏效果
2020/12/10 Javascript
[13:38]2015国际邀请赛中国战队出征仪式
2015/05/29 DOTA
Python读取图片EXIF信息类库介绍和使用实例
2014/07/10 Python
使用Python脚本将绝对url替换为相对url的教程
2015/04/24 Python
Python装饰器使用实例:验证参数合法性
2015/06/24 Python
使用celery执行Django串行异步任务的方法步骤
2019/06/06 Python
python简单的三元一次方程求解实例
2020/04/02 Python
Python 程序员必须掌握的日志记录
2020/08/17 Python
5个你不知道的HTML5的接口介绍
2013/08/07 HTML / CSS
英国豪华家具和经典家居饰品购物网站:OKA
2020/06/05 全球购物
英国领先的男装设计师服装独立零售商:Repertoire Fashion
2020/10/19 全球购物
2014年自我评价
2014/01/04 职场文书
校园歌手大赛策划书
2014/01/17 职场文书
初三化学教学反思
2014/01/23 职场文书
2014年感恩节活动策划方案
2014/10/06 职场文书
2014年绿化工作总结
2014/12/09 职场文书
出纳岗位职责范本
2015/03/31 职场文书
一文了解MYSQL三大范式和表约束
2022/04/03 MySQL
JAVA springCloud项目搭建流程
2022/05/11 Java/Android