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 GD 图像处理组件的常用函数总结
Apr 28 PHP
说说PHP的autoLoad自动加载机制
Sep 27 PHP
PHP读取PDF内容配合Xpdf的使用
Nov 24 PHP
解析php时间戳与日期的转换
Jun 06 PHP
Discuz7.2版的faq.php SQL注入漏洞分析
Aug 06 PHP
深入理解PHP变量的值类型和引用类型
Oct 21 PHP
PHP实现的蚂蚁爬杆路径算法代码
Dec 03 PHP
CI框架整合smarty步骤详解
May 19 PHP
thinkPHP2.1自定义标签库的导入方法详解
Jul 20 PHP
thinkPHP模板引擎用法示例
Dec 08 PHP
PHP函数按引用传递参数及函数可选参数用法示例
Jun 04 PHP
php7 新增功能实例总结
May 25 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 数组的创建、调用和更新实现代码
2009/03/09 PHP
关于查看MSSQL 数据库 用户每个表 占用的空间大小
2013/06/21 PHP
PHP处理SQL脚本文件导入到MySQL的代码实例
2014/03/17 PHP
php简单实现批量上传图片的方法
2016/05/09 PHP
实例讲解php将字符串输出到HTML
2019/01/27 PHP
html读出文本文件内容
2007/01/22 Javascript
用jquery实现学校的校历(asp.net+jquery ui 1.72)
2010/01/01 Javascript
JavaScript中使用正则匹配多条,且获取每条中的分组数据
2010/11/30 Javascript
jquery 3D 标签云示例代码
2014/06/12 Javascript
日常收藏的jquery技巧
2015/12/02 Javascript
JavaScript判断DIV内容是否为空的方法
2016/01/29 Javascript
基于jquery实现下拉框美化特效
2016/02/02 Javascript
第九篇Bootstrap导航菜单创建步骤详解
2016/06/21 Javascript
Javascript中内建函数reduce的应用详解
2016/10/20 Javascript
js实现手机发送验证码功能
2017/03/13 Javascript
Bootstrap table中toolbar新增条件查询及refresh参数使用方法
2018/05/18 Javascript
如何制作一个Node命令行图像识别工具
2018/12/12 Javascript
JavaScript事件概念详解(区分静态注册和动态注册)
2021/02/05 Javascript
[00:13]天涯墨客二技能展示
2018/08/25 DOTA
Python使用回溯法子集树模板获取最长公共子序列(LCS)的方法
2017/09/08 Python
基于Python log 的正确打开方式
2018/04/28 Python
pytorch + visdom 处理简单分类问题的示例
2018/06/04 Python
python接口自动化测试之接口数据依赖的实现方法
2019/04/26 Python
Django使用中间键实现csrf认证详解
2019/07/22 Python
Django项目后台不挂断运行的方法
2019/08/31 Python
美国现代家具购物网站:LexMod
2019/01/09 全球购物
size?丹麦官网:英国伦敦的球鞋精品店
2019/04/15 全球购物
C++程序员求职信
2014/05/07 职场文书
三方股东合作协议书
2014/10/28 职场文书
民主评议政风行风活动心得体会
2014/10/29 职场文书
2014年城市管理工作总结
2014/12/02 职场文书
公司人力资源管理制度
2015/08/05 职场文书
大学毕业生自我鉴定范文
2019/06/21 职场文书
闭幕词的写作格式与范文!
2019/06/24 职场文书
如何撰写促销方案?
2019/07/05 职场文书
Linux安装Docker详细教程
2022/07/07 Servers