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 27 PHP
基于php和mysql的简单的dao类实现crud操作功能
Jan 27 PHP
PHP连接和操作MySQL数据库基础教程
Sep 29 PHP
Java和PHP在Web开发方面对比分析
Mar 01 PHP
PHP中余数、取余的妙用
Jun 29 PHP
PHP判断FORM表单或URL参数来的数据是否为整数的方法
Mar 25 PHP
PHP数据库操作三:redis用法分析
Aug 16 PHP
PHP实现链表的定义与反转功能示例
Jun 09 PHP
thinkPHP框架实现的短信接口验证码功能示例
Jun 20 PHP
从ThinkPHP3.2.3过渡到ThinkPHP5.0学习笔记图文详解
Apr 03 PHP
Laravel Validator 实现两个或多个字段联合索引唯一
May 08 PHP
Laravel框架实现即点即改功能的方法分析
Oct 31 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阻止页面后退的方法分享
2014/02/17 PHP
ThinkPHP内置jsonRPC的缺陷分析
2014/12/18 PHP
Zend Framework教程之Zend_Helpers动作助手ViewRenderer用法详解
2016/07/20 PHP
PHP随机生成中文段落示例【测试网站内容时使用】
2020/04/26 PHP
js cookies 常见网页木马挂马代码 24小时只加载一次
2009/04/13 Javascript
javascript 正则表达式相关应介绍
2012/11/27 Javascript
JS Replace()的高级使用方法介绍
2013/06/29 Javascript
jQery使网页在显示器上居中显示适用于任何分辨率
2014/06/09 Javascript
jQuery Mobile弹出窗、弹出层知识汇总
2016/01/05 Javascript
js编写一个简单的产品放大效果代码
2016/06/27 Javascript
ES6新特征数字、数组、字符串
2016/10/01 Javascript
Jquery Easyui进度条组件Progress使用详解(8)
2020/03/26 Javascript
浅谈jQuery中事情的动态绑定
2017/02/12 Javascript
vue-dialog的弹出层组件
2020/05/25 Javascript
angularjs使用div模拟textarea文本框的方法
2018/10/02 Javascript
详解JSON和JSONP劫持以及解决方法
2019/03/08 Javascript
layui表格设计以及数据初始化详解
2019/10/26 Javascript
Vue文本模糊匹配功能如何实现
2020/07/30 Javascript
[10:28]2018DOTA2国际邀请赛寻真——VGJ.S寻梦之路
2018/08/15 DOTA
Python的Django框架中settings文件的部署建议
2015/05/30 Python
Windows系统下使用flup搭建Nginx和Python环境的方法
2015/12/25 Python
利用python爬取斗鱼app中照片方法实例
2017/12/03 Python
Python 找到列表中满足某些条件的元素方法
2018/06/26 Python
pytorch查看模型weight与grad方式
2020/06/24 Python
台湾网购生鲜第一品牌:i3Fresh爱上新鲜
2017/10/26 全球购物
综合办公室主任职责
2013/12/16 职场文书
公司员工检讨书
2014/02/08 职场文书
2014教师研修学习体会
2014/07/08 职场文书
社区务虚会发言材料
2014/10/20 职场文书
音乐教师个人总结
2015/02/06 职场文书
地震慰问信
2015/02/14 职场文书
卫生院艾滋病宣传活动总结
2015/05/09 职场文书
致运动员加油稿
2015/07/21 职场文书
Nginx安装完成没有生成sbin目录的解决方法
2021/03/31 Servers
python实现ROA算子边缘检测算法
2021/04/05 Python
Keras多线程机制与flask多线程冲突的解决方案
2021/05/28 Python