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中的phpinfo()函数
Jun 06 PHP
在wamp集成环境下升级php版本(实现方法)
Jul 01 PHP
php使用异或实现的加密解密实例
Sep 04 PHP
通过dbi使用perl连接mysql数据库的方法
Apr 16 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(六)
Jun 23 PHP
destoon调用企业会员公司形象图片的实现方法
Aug 21 PHP
php中header跳转使用include包含解决参数丢失问题
May 08 PHP
PHP多维数组元素操作类的方法
Nov 14 PHP
详解PHP函数 strip_tags 处理字符串缺陷bug
Jun 11 PHP
php中的explode()函数实例介绍
Jan 18 PHP
PHP数据对象映射模式实例分析
Mar 29 PHP
php中文语义分析实现方法示例
Sep 28 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(2)
2006/10/09 PHP
php并发对MYSQL造成压力的解决方法
2013/02/21 PHP
支持中文和其他编码的php截取字符串函数分享(截取中文字符串)
2014/03/13 PHP
微信红包随机生成算法php版
2016/07/21 PHP
jQuery中使用了document和window哪些属性和方法小结
2011/09/13 Javascript
javascript中常用编程知识
2013/04/08 Javascript
jquery表单验证框架提供的身份证验证方法(示例代码)
2013/12/27 Javascript
使用Raygun对Node.js应用进行错误处理的方法
2015/06/23 Javascript
js与jQuery实现checkbox复选框全选/全不选的方法
2016/01/05 Javascript
浅析jQuery 遍历函数,javascript中的each遍历
2016/05/25 Javascript
浅谈Javascript数据属性与访问器属性
2016/07/26 Javascript
js无提示关闭浏览器窗口的两种方法分析
2016/11/06 Javascript
JS失效 提示HTML1114: (UNICODE 字节顺序标记)的代码页 utf-8 覆盖(META 标记)的冲突的代码页 utf-8
2017/06/23 Javascript
vue2.0+vue-dplayer实现hls播放的示例
2018/03/02 Javascript
vue和webpack打包项目相对路径修改的方法
2018/06/15 Javascript
Vue 开发音乐播放器之歌手页右侧快速入口功能
2018/08/08 Javascript
JointJS流程图的绘制方法
2018/12/03 Javascript
微信小程序登录时如何获取input框中的内容
2019/12/04 Javascript
node实现mock-plugin中间件的方法
2019/12/25 Javascript
基于原生js实现九宫格算法代码实例
2020/07/03 Javascript
如何检测JavaScript中的死循环示例详解
2020/08/30 Javascript
Vue实现指令式动态追加小球动画组件的步骤
2020/12/18 Vue.js
[49:31]DOTA2-DPC中国联赛 正赛 Elephant vs LBZS BO3 第二场 1月29日
2021/03/11 DOTA
学习python 之编写简单乘法运算题
2016/02/27 Python
详谈套接字中SO_REUSEPORT和SO_REUSEADDR的区别
2018/04/28 Python
flask入门之表单的实现
2018/07/18 Python
详解python变量与数据类型
2020/08/25 Python
详解python的xlwings库读写excel操作总结
2021/02/26 Python
HTML5 声明兼容IE的写法
2011/05/16 HTML / CSS
大学生优秀的自我评价分享
2013/10/22 职场文书
警察正风肃纪剖析材料
2014/10/16 职场文书
拾金不昧表扬信怎么写
2015/05/04 职场文书
步步惊心观后感
2015/06/12 职场文书
2016年“我们的节日·端午节”活动总结
2016/04/01 职场文书
k-means & DBSCAN 总结
2021/04/27 Python
mysql外连接与内连接查询的不同之处
2021/06/03 MySQL