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转成EXE文件
Oct 09 PHP
完善CodeIgniter在IDE中代码提示功能的方法
Jul 19 PHP
php调用mysql存储过程实例分析
Dec 29 PHP
php使用ZipArchive函数实现文件的压缩与解压缩
Oct 27 PHP
PHP共享内存用法实例分析
Feb 12 PHP
phalcon框架使用指南
Feb 23 PHP
yii2 modal弹窗之ActiveForm ajax表单异步验证
Jun 13 PHP
PHP中用mysqli面向对象打开连接关闭mysql数据库的方法
Nov 05 PHP
PHP yii实现model添加默认值的方法(两种方法)
Nov 10 PHP
微信 开发生成带参数的二维码的实例
Nov 23 PHP
PHP 500报错的快速解决方法
Dec 14 PHP
PHP API接口必备之输出json格式数据示例代码
Jun 27 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和MySQL保存和输出图片
2006/10/09 PHP
php 正则 过滤html 的超链接
2009/06/02 PHP
CI框架简单邮件发送类实例
2016/05/18 PHP
php 使用expat方式解析xml文件操作示例
2019/11/26 PHP
Javascript创建Silverlight Plugin以及自定义nonSilverlight和lowSilverlight样式
2010/06/28 Javascript
ASP.NET jQuery 实例9  通过控件hyperlink实现返回顶部效果
2012/02/03 Javascript
JavaScript如何从listbox里同时删除多个项目
2013/10/12 Javascript
JSON.parse()和JSON.stringify()使用介绍
2014/06/20 Javascript
javascript生成随机数方法汇总
2015/11/12 Javascript
JS三级可折叠菜单实现方法
2016/02/29 Javascript
jQuery操作dom实现弹出页面遮罩层(web端和移动端阻止遮罩层的滑动)
2016/08/25 Javascript
jQuery的Read()方法代替原生JS详解
2016/11/08 Javascript
JS实现验证码倒计时的注册页面
2018/01/02 Javascript
vue2 全局变量的设置方法
2018/03/09 Javascript
微信小程序实现聊天对话(文本、图片)功能
2018/07/06 Javascript
webpack+vue-cil中proxyTable处理跨域的方法
2018/07/20 Javascript
vue2 v-model/v-text 中使用过滤器的方法示例
2019/05/09 Javascript
使用纯前端JavaScript实现Excel导入导出方法过程详解
2020/08/07 Javascript
vite2.0+vue3移动端项目实战详解
2021/03/03 Vue.js
Python中使用select模块实现非阻塞的IO
2015/02/03 Python
python避免死锁方法实例分析
2015/06/04 Python
使用PyCharm配合部署Python的Django框架的配置纪实
2015/11/19 Python
Python用threading实现多线程详解
2017/02/03 Python
Pycharm新建模板默认添加个人信息的实例
2019/07/15 Python
Django文件存储 默认存储系统解析
2019/08/02 Python
HTML5梦幻之旅——炫丽的流星雨效果实现过程
2013/08/06 HTML / CSS
char型变量中能不能存贮一个中文汉字
2015/07/08 面试题
甜美蛋糕店创业计划书
2014/01/30 职场文书
电子信息工程专业推荐信
2014/02/14 职场文书
年终晚会活动方案
2014/08/21 职场文书
2014入党积极分子批评与自我批评思想汇报
2014/09/20 职场文书
出纳工作检讨书
2014/10/18 职场文书
阿甘正传观后感
2015/06/01 职场文书
2016春季幼儿园小班开学寄语
2015/12/03 职场文书
什么是执行力?9个故事告诉您:成功绝非偶然!
2019/07/05 职场文书
2019年公司卫生管理制度样本
2019/08/21 职场文书