2019独角兽企业重金招聘Python工程师标准>>>

17.访问者模式

貌似这是螃蟹学的最后一个设计模式了,可能还有其他的,不过常用的也够了。所谓访问者设计模式,其实也好理解,就是通过访问者实现访对象的访问和处理。就像我计划要去旅游,好多国家都想去,但是我可能是一次游完,最佳就是一次去一个好好玩一下。访问者设计模式在于对象的功能处理,不需要全部定义在原对象里,而是拆分处理,便于更多的开发者参与进来,也可以很好拓展。

参考项目模块:商品排序

由于商品对象是固定的,但经常要对商品进行不同的排序,而不同的排序得出的商品列表格式都是相同的,那么使用访问者设计模式来实现对商品的处理就是很好的方式。这里螃蟹再次尝试用新的方式来实现商品排序。

商品对象:Goods.class.php

<?php class Goods{public $title = '';public $price = 0;public $distance = 0;public function __construct($goods){$this->title = $goods['title'];$this->price = $goods['price'];$this->distance = $goods['distance'];}public function getArray(){return array('title'=>$this->title,'price'=>$this->price,'distance'=>$this->distance);}}?>

商品集合对象:GoodsList.class.php

<?php
require_once('Goods.class.php');class GoodsList{public $goods_objs = '';public $goods_array = '';public function __construct(){$this->goods_objs = array();$this->goods_array = array();}public function addGoods(Goods $goods){array_push($this->goods_objs, $goods);array_push($this->goods_array, $goods->getArray());}public function getDefaultList(){foreach ($this->goods_objs as $goods){echo '          商品名:'.$goods->title;echo '    价格:'.$goods->price;echo '    距离:'.$goods->distance;echo '<br><br>';}}public function getOrderList(){foreach ($this->goods_array as $goods){echo '    商品名:'.$goods['title'];echo '    价格:'.$goods['price'];echo '    距离:'.$goods['distance'];echo '<br><br>';}}public function getVisitor($visitor,$sortType='ASC'){if($sortType=='ASC'){$this->goods_array = $visitor->AscSort($this->goods_array);}else{$this->goods_array = $visitor->DescSort($this->goods_array);}}}?>

在集合对象里面定义了排序相关的访问者方法,通过此方法去调用访问者对象。

价格排序访问类:PriceSort.visitor.php

<?php
require_once('Sort.fun.php');class PriceSort{public function AscSort($goodslist){return SortFun::subSort($goodslist, 'price','ASC');      }public function DescSort($goodslist){return SortFun::subSort($goodslist, 'price','DESC');}
}
?>

距离排序访问类:DistanceSort.visitor.php

<?php
require_once('Sort.fun.php');class DistanceSort{public function AscSort($goodslist){return SortFun::subSort($goodslist, 'distance','ASC');}public function DescSort($goodslist){return SortFun::subSort($goodslist, 'distance','DESC');}
}
?>

然后写个功能类,里面自定义一个二维数组排序算法:Sort.fun.php

<?php
class SortFun{//二维数组排序算法public static function subSort($arr,$keys,$type='ASC'){$keysvalue = $new_array = array();foreach ($arr as $k=>$v){$keysvalue[$k] = $v[$keys];}if($type == 'ASC'){asort($keysvalue);}else{arsort($keysvalue);}reset($keysvalue);$i=0;foreach ($keysvalue as $k=>$v){$new_array[$i] = $arr[$k];$i++;}return $new_array;}}?>

最后编写测试文件:TestVisitor.php

<?php
function __autoload($className){if(file_exists($className.'.class.php')){require_once($className.'.class.php');}if(file_exists($className.'.visitor.php')){require_once($className.'.visitor.php');}
}//模拟商品数据
$goods = array();
$goods[0] = array('title'=>'六神花露水','price'=>12.99,'distance'=>3.04);
$goods[1] = array('title'=>'七神花露水','price'=>10.99,'distance'=>1.14);
$goods[2] = array('title'=>'八神花露水','price'=>8.99,'distance'=>5.24);
$goods[3] = array('title'=>'九神花露水','price'=>23.29,'distance'=>0.74);
$goods[4] = array('title'=>'十神花露水','price'=>1.99,'distance'=>13.64);//添加到商品集合
$goodsLists = new GoodsList();
foreach ($goods as $goodsData){$goodsobj = new Goods($goodsData);$goodsLists->addGoods($goodsobj);
}echo '<h3>正常输出</h3>';
$goodsLists->getDefaultList();echo '<h3>按价格从高到低</h3>';
$goodsLists->getVisitor(new PriceSort(),'DESC');
$goodsLists->getOrderList();echo '<h3>按价格从低到高</h3>';
$goodsLists->getVisitor(new PriceSort(),'ASC');
$goodsLists->getOrderList();echo '<h3>按距离从近到远</h3>';
$goodsLists->getVisitor(new DistanceSort(),'ASC');
$goodsLists->getOrderList();?>

测试结果:

正常输出商品名:六神花露水 价格:12.99 距离:3.04商品名:七神花露水 价格:10.99 距离:1.14商品名:八神花露水 价格:8.99 距离:5.24商品名:九神花露水 价格:23.29 距离:0.74商品名:十神花露水 价格:1.99 距离:13.64按价格从高到低商品名:九神花露水 价格:23.29 距离:0.74商品名:六神花露水 价格:12.99 距离:3.04商品名:七神花露水 价格:10.99 距离:1.14商品名:八神花露水 价格:8.99 距离:5.24商品名:十神花露水 价格:1.99 距离:13.64按价格从低到高商品名:十神花露水 价格:1.99 距离:13.64商品名:八神花露水 价格:8.99 距离:5.24商品名:七神花露水 价格:10.99 距离:1.14商品名:六神花露水 价格:12.99 距离:3.04商品名:九神花露水 价格:23.29 距离:0.74按距离从近到远商品名:九神花露水 价格:23.29 距离:0.74商品名:七神花露水 价格:10.99 距离:1.14商品名:六神花露水 价格:12.99 距离:3.04商品名:八神花露水 价格:8.99 距离:5.24商品名:十神花露水 价格:1.99 距离:13.64

可以看到商品排序很方便,而且结构很清晰。如果后面要添加按时间,按浏览量,按购买量排序都很好拓展,即便不同的程序员来开发,按照这种定义方式也是很容易上手的。

PHP的设计到这里就告一段落了,螃蟹也感觉收货不少,面向对象的很多概念又重温了一遍,后面肯定会在项目中尝试使用各种设计模式,提高项目的质量,也算是提高螃蟹自身的价值吧。好吧,还有一会下班,周末愉快~~

转载于:https://my.oschina.net/caroltc/blog/301589

螃蟹学PHP设计模式之访问者模式相关推荐

  1. 螃蟹学PHP设计模式之解释器模式

    2019独角兽企业重金招聘Python工程师标准>>> 8.解释器模式 今天又迟到了一个小时,不过现在基本任务都做完了,螃蟹的效率还是挺高的.昨天一天跑各个工商局,发现大学生创业的扶 ...

  2. php 解释器模式,螃蟹学PHP设计模式之解释器模式

    8.解释器模式 今天又迟到了一个小时,不过现在基本任务都做完了,螃蟹的效率还是挺高的.昨天一天跑各个工商局,发现大学生创业的扶持真是太少了,还是写代码比较顺心.越学到后面,就越需要理解和区别不同的设计 ...

  3. 建造者模式 php,螃蟹学PHP设计模式之建造者模式

    2.建造者模式 螃蟹今天要学习建造者模式了,昨天的适配器记得还是很清楚的.对于建造者模式,螃蟹的理解是你有10部iphone手机要充电,假设充电器额定电压都是220v,但是外电压不稳定,可能是220v ...

  4. 迭代子模式 php,螃蟹学PHP设计模式之迭代器模式

    9.迭代器模式 中午睡了一个半小时,现在可以上班了,趁着还没下班先把迭代器模式搞定.回顾上午学的解释器模式是比较简单易懂的,而下午的迭代器模式螃蟹也觉得是比较好理解的.就是循环输出对象集合时采用迭代器 ...

  5. SON_EXAM考试php,螃蟹学PHP设计模式之模板模式

    16.模板模式 貌似可以把模板模式学习一下了.初次接触螃蟹还以为是之前的外观模式的马甲,实则不是这样的.这就好比一台机器,把机器的操作写到一个程序里,让程序来自动控制机器的作业.模板模式就是定义了一系 ...

  6. Java设计模式(访问者模式-迭代器模式-观察者模式-中介者模式)

    Java设计模式Ⅶ 1.访问者模式 1.1 访问者模式概述 1.2 代码理解 2.迭代器模式 2.1 迭代器模式概述 2.2 代码理解 3.观察者模式 3.1 观察者模式概述 3.2 代码理解 4.中 ...

  7. 北风设计模式课程---访问者模式(Visitor)

    北风设计模式课程---访问者模式(Visitor) 一.总结 一句话总结: 设计模式是日常问题的经验总结方案,所以学好设计模式对日常出现的问题可以有很好的解决. 访问者设计模式有点神似 抽象工厂模式, ...

  8. 研磨设计模式 之 访问者模式(Visitor)2——跟着cc学设计系列

    25.2  解决方案 25.2.1  访问者模式来解决 用来解决上述问题的一个合理的解决方案,就是使用访问者模式.那么什么是访问者模式呢? (1)访问者模式定义 (2)应用访问者模式来解决的思路 仔细 ...

  9. 设计模式之访问者模式(Visitor)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  10. 设计模式复习-访问者模式

    VisitorMode.h#pragma once #include<list> #include<string> #include<iostream> using ...

最新文章

  1. Ch2,KNN分类算法程序分析----机器学习实践P19页
  2. Linxu嵌入式汇编语言
  3. SCCM2012升级SP1系列之配置管理SCCM2012①发现和管理SCCM2012客户端
  4. CloudFoundry应用的自定义端口的命令行设置方式
  5. IPM: 使用代码删除Acquisition contract上的IP Product
  6. 只做macd二次金叉_MACD指标的各种金叉、二次金叉都是买入信号吗?本文会给你答案...
  7. 值得推荐的C/C++框架和库 转
  8. Vuejs——(4)v-if、v-for
  9. css磨砂效果背景和特殊背景
  10. java为什么用咖啡?
  11. 小游戏:红色警戒争霸战!
  12. C# 给Word每一页设置不同图片水印
  13. Toast 消息提示框
  14. Vue实现页面的局部刷新
  15. html ui组件,UI组件
  16. 我是一个硬件工程师,面试官随口问了这些问题 | 收藏
  17. 计网day12 奈氏准则和香农定理
  18. C语言——一个正整数如果等于组成它的各位数字的阶乘之和,该整数称为阶乘和数。
  19. 试用蓝牙模块的一点经验整理(Part 1, 刷HM-10固件)
  20. Windows10开机执行自动拨号

热门文章

  1. javafx实现读者文摘上的文章预览及下载
  2. MVC---------ViewBag
  3. HDFS 命令深入浅出
  4. [Python] 对 Python 装饰器的理解心得
  5. SQL SERVER 数据类型详解[zt]
  6. alias自定义别名
  7. iOS开发日记19-7.0之后的截屏方法
  8. 局域网内手机访问电脑网站注意几点
  9. Controller比较两个对象discs、outlets中的元素是否相等。相同则相应的checkbox为checked...
  10. Drupal是如何避免页面缓存保存Message信息的