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安全配置
Dec 06 PHP
php简单静态页生成过程
Mar 27 PHP
用PHP程序实现支持页面后退的两种方法
Jun 30 PHP
php简单的会话类代码
Aug 08 PHP
Thinkphp中数据按分类嵌套循环实现方法
Oct 30 PHP
PHP 数据结构队列(SplQueue)和优先队列(SplPriorityQueue)简单使用实例
May 12 PHP
原生php实现excel文件读写的方法分析
Apr 25 PHP
PHP开发的文字水印,缩略图,图片水印实现类与用法示例
Apr 12 PHP
php5.6.x到php7.0.x特性小结
Aug 17 PHP
laravel实现图片上传预览,及编辑时可更换图片,并实时变化的例子
Nov 14 PHP
实例讲解PHP表单
Jun 10 PHP
PHP实现Snowflake生成分布式唯一ID的方法示例
Aug 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写的采集程序
2007/03/16 PHP
php实现的简单日志写入函数
2015/03/31 PHP
PHP读取mssql json数据中文乱码的解决办法
2016/04/11 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
2017/12/25 PHP
Javascript 篱式条件判断
2008/08/22 Javascript
JavaScript中函数声明优先于变量声明的实例分析
2012/03/01 Javascript
js格式化金额可选是否带千分位以及保留精度
2014/01/28 Javascript
JavaScript代码因逗号不规范导致IE不兼容的问题
2016/02/25 Javascript
分享12个实用的jQuery代码片段
2016/03/09 Javascript
javascript字符串对象常用api函数小结(连接,替换,分割,转换等)
2016/09/20 Javascript
jquery动态添加文本并获取值的方法
2016/10/12 Javascript
Vue.js组件tree实现无限级树形菜单
2016/12/02 Javascript
微信小程序 input表单与redio及下拉列表的使用实例
2017/09/20 Javascript
select获取下拉框的值 下拉框默认选中方法
2018/02/28 Javascript
js获取本日、本周、本月的时间代码
2020/02/01 Javascript
Python中使用tarfile压缩、解压tar归档文件示例
2015/04/05 Python
用Python实现web端用户登录和注册功能的教程
2015/04/30 Python
python数据清洗系列之字符串处理详解
2017/02/12 Python
python实现读取excel写入mysql的小工具详解
2017/11/20 Python
Python实现的微信好友数据分析功能示例
2018/06/21 Python
学生信息管理系统python版
2018/10/17 Python
python 快速把超大txt文件转存为csv的实例
2018/10/26 Python
Python设计模式之备忘录模式原理与用法详解
2019/01/15 Python
python实现本地批量ping多个IP的方法示例
2019/08/07 Python
Python实现子类调用父类的初始化实例
2020/03/12 Python
matplotlib subplot绘制多个子图的方法示例
2020/07/28 Python
CSS3 Media Queries(响应式布局可以让你定制不同的分辨率和设备)
2013/06/06 HTML / CSS
全国优秀教师事迹材料
2014/08/26 职场文书
教师自我剖析材料(群众路线)
2014/09/29 职场文书
社区学习党的群众路线教育实践活动心得体会
2014/11/03 职场文书
诚实守信主题班会
2015/08/13 职场文书
巾帼建功标兵先进事迹材料
2016/02/29 职场文书
入党申请书格式
2019/06/20 职场文书
基于Golang 高并发问题的解决方案
2021/05/08 Golang
浅谈Python中的正则表达式
2021/06/28 Python
JavaScript组合继承详解
2021/11/07 Javascript