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 面向对象 PHP5 中的常量
May 05 PHP
解析php通过cookies获取远程网页的指定代码
Jun 25 PHP
ueditor 1.2.6 使用方法说明
Jul 24 PHP
PHP中使用SimpleXML检查XML文件结构实例
Jan 07 PHP
PHP直接修改表内容DataGrid功能实现代码
Sep 24 PHP
Zend Framework+smarty用法实例详解
Mar 19 PHP
PHP实现的自定义数组排序函数与排序类示例
Nov 18 PHP
PHP实现批量重命名某个文件夹下所有文件的方法
Sep 04 PHP
PHP CURL中传递cookie的方法步骤
May 09 PHP
PHP实现与java 通信的插件使用教程
Aug 11 PHP
php项目中类的自动加载实例讲解
Sep 12 PHP
Yii2.0框架behaviors方法使用实例分析
Sep 30 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 获取当前访问的url文件名的方法小结
2010/02/08 PHP
php简单随机字符串生成方法示例
2017/04/19 PHP
PHP生成各种随机验证码的方法总结【附demo源码】
2017/06/05 PHP
jQuery flip插件实现的翻牌效果示例【附demo源码下载】
2016/09/20 Javascript
详解angularjs获取元素以及angular.element()用法
2017/07/25 Javascript
JS实现字符串中去除指定子字符串方法分析
2018/05/17 Javascript
vue页面引入three.js实现3d动画场景操作
2020/08/10 Javascript
vue单应用在ios系统中实现微信分享功能操作
2020/09/07 Javascript
[36:16]完美世界DOTA2联赛PWL S3 access vs Rebirth 第一场 12.19
2020/12/24 DOTA
python使用PIL缩放网络图片并保存的方法
2015/04/24 Python
Windows下PyMongo下载及安装教程
2015/04/27 Python
python使用win32com库播放mp3文件的方法
2015/05/30 Python
Python单元测试unittest的具体使用示例
2018/12/17 Python
Python面向对象程序设计OOP入门教程【类,实例,继承,重载等】
2019/01/05 Python
Python常用模块之requests模块用法分析
2019/05/15 Python
Python字符串的一些操作方法总结
2019/06/10 Python
Python3.8对可迭代解包的改进及用法详解
2019/10/15 Python
pytorch绘制并显示loss曲线和acc曲线,LeNet5识别图像准确率
2020/01/02 Python
flask 实现上传图片并缩放作为头像的例子
2020/01/09 Python
如何验证python安装成功
2020/07/06 Python
Django返回HTML文件的实现方法
2020/09/17 Python
详解Python中list[::-1]的几种用法
2020/11/16 Python
利用python如何实现猫捉老鼠小游戏
2020/12/04 Python
canvas学习笔记之绘制简单路径
2019/01/28 HTML / CSS
东南亚地区最大的购物网站Lazada新加坡站点:Lazada.sg
2016/07/17 全球购物
介绍一下Transact-SQL中SPACE函数的用法
2015/09/01 面试题
高中生校园生活自我评价
2013/09/19 职场文书
幼儿园招生广告
2014/03/19 职场文书
爱护草坪标语
2014/06/24 职场文书
敬老月活动总结
2014/08/28 职场文书
教师学习三严三实心得体会
2014/10/13 职场文书
优秀班组事迹材料
2014/12/24 职场文书
教师岗位说明书
2015/09/30 职场文书
保险公司岗前培训工作总结
2015/10/24 职场文书
创业计划书之农家乐
2019/10/09 职场文书
JavaScript异步操作中串行和并行
2021/11/20 Javascript