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生成缩略图的类代码
Oct 02 PHP
《PHP编程最快明白》第三讲:php数组
Nov 01 PHP
PHP页面中文乱码分析
Oct 29 PHP
php实现获取局域网所有用户的电脑IP和主机名、及mac地址完整实例
Jul 18 PHP
PHP获取QQ达人QQ信息的方法
Mar 05 PHP
php+ajax 实现输入读取数据库显示匹配信息
Oct 08 PHP
Symfony2安装第三方Bundles实例详解
Feb 04 PHP
24条货真价实的PHP代码优化技巧
Jul 28 PHP
如何打开php的gd2库
Feb 09 PHP
PHP基于正则批量替换Img中src内容实现获取缩略图的功能示例
Jun 07 PHP
PHP生成随机码的思路与方法实例探索
Apr 11 PHP
mac pecl 安装php7.1扩展教程
Oct 17 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
destoon会员注册提示“数据校验失败(2)”解决方法
2014/06/21 PHP
jquery nth-child()选择器的简单应用
2010/07/10 Javascript
Javascript中的this绑定介绍
2011/09/22 Javascript
jQuery插件原来如此简单 jQuery插件的机制及实战
2012/02/07 Javascript
jquery实现的带缩略图的焦点图片切换(自动播放/响应鼠标动作)
2013/01/23 Javascript
JQuery性能优化的几点建议
2014/05/14 Javascript
基于iframe实现类似于ajax的页面无刷新
2014/05/31 Javascript
JS实现让访问者自助选择网页文字颜色的方法
2015/02/24 Javascript
jQuery实现简单的日期输入格式化控件
2015/03/12 Javascript
使用js实现的简单拖拽效果
2015/03/18 Javascript
jQuery实现宽屏图片轮播实例教程
2015/11/24 Javascript
Bootstrap实现圆角、圆形头像和响应式图片
2016/12/14 Javascript
canvas实现图片根据滑块放大缩小效果
2017/02/24 Javascript
angular 用拦截器统一处理http请求和响应的方法
2017/06/08 Javascript
最基础的vue.js双向绑定操作
2017/08/23 Javascript
使用命令行工具npm新创建一个vue项目的方法
2017/12/27 Javascript
微信小程序JS加载esmap地图的实例详解
2019/09/04 Javascript
CountUp.js实现数字滚动增值效果
2019/10/17 Javascript
[02:43]DOTA2英雄基础教程 德鲁伊
2014/01/13 DOTA
收集的几个Python小技巧分享
2014/11/22 Python
python结合API实现即时天气信息
2016/01/19 Python
Python发送form-data请求及拼接form-data内容的方法
2016/03/05 Python
python format 格式化输出方法
2018/07/16 Python
解决tensorflow模型参数保存和加载的问题
2018/07/26 Python
python 使用装饰器并记录log的示例代码
2019/07/12 Python
利用anaconda作为python的依赖库管理方法
2019/08/13 Python
Pytorch: 自定义网络层实例
2020/01/07 Python
python opencv实现图片缺陷检测(讲解直方图以及相关系数对比法)
2020/04/07 Python
Python 实现自动登录+点击+滑动验证功能
2020/06/10 Python
CSS3+HTML5+JS 实现一个块的收缩与展开动画效果
2020/11/17 HTML / CSS
财务部岗位职责
2013/11/19 职场文书
机关领导查摆四风思想汇报
2014/09/13 职场文书
2014大学生党员评议个人总结
2014/09/22 职场文书
乡镇群众路线整改落实情况汇报
2014/10/28 职场文书
CSS3鼠标悬浮过渡缩放效果
2021/04/17 HTML / CSS
Spring-cloud Config Server的3种配置方式
2021/09/25 Java/Android