php设计模式之策略模式
2016-07-24 21:00
543 查看
在此模式中,算法是从复杂类提取的,因而可以方便地替换。
例如,如果要更改搜索引擎中排列页的方法,则策略模式是一个不错的选择。思考一下搜索引擎的几个部分 —— 一部分遍历页面,一部分对每页排列,另一部分基于排列的结果排序。在复杂的示例中,这些部分都在同一个类中。通过使用策略模式,您可将排列部分放入另一个 类中,以便更改页排列的方式,而不影响搜索引擎的其余代码。
作为一个较简单的示例,下面 显示了一个用户列表类,它提供了一个根据一组即插即用的策略查找一组用户的方法
例如,如果要更改搜索引擎中排列页的方法,则策略模式是一个不错的选择。思考一下搜索引擎的几个部分 —— 一部分遍历页面,一部分对每页排列,另一部分基于排列的结果排序。在复杂的示例中,这些部分都在同一个类中。通过使用策略模式,您可将排列部分放入另一个 类中,以便更改页排列的方式,而不影响搜索引擎的其余代码。
作为一个较简单的示例,下面 显示了一个用户列表类,它提供了一个根据一组即插即用的策略查找一组用户的方法
//定义接口 interface IStrategy { function filter($record); } //实现接口方式1 class FindAfterStrategy implements IStrategy { private $_name; public function __construct($name) { $this->_name = $name; } public function filter($record) { return strcmp ( $this->_name, $record ) <= 0; } } //实现接口方式1 class RandomStrategy implements IStrategy { public function filter($record) { return rand ( 0, 1 ) >= 0.5; } } //主类 class UserList { private $_list = array (); public function __construct($names) { if ($names != null) { foreach ( $names as $name ) { $this->_list [] = $name; } } } public function add($name) { $this->_list [] = $name; } public function find($filter) { $recs = array (); foreach ( $this->_list as $user ) { if ($filter->filter ( $user )) $recs [] = $user; } return $recs; } } $ul = new UserList ( array ( "Andy", "Jack", "Lori", "Megan" ) ); $f1 = $ul->find ( new FindAfterStrategy ( "J" ) ); print_r ( $f1 ); $f2 = $ul->find ( new RandomStrategy () ); 复制代码 print_r ( $f2 ); 策略模式非常适合复杂数据管理系统或数据处理系统,二者在数据筛选、搜索或处理的方式方面需要较高的灵活性
相关文章推荐
- php设计模式之观察者模式
- php设计模式之单例模式
- ContentProvider(内容提供者),UriMatcher(Uri匹配器)
- ThinkPHP的四种路由形式
- YII如何隐藏URL中的index.php
- PHP判断变量是否为空的几种方法区别
- php中带关键字搜索功能的分页函数的设计及实例
- php URL图片资源传参生成对应尺寸图片
- 关闭游览器后, php程序还会执行吗?
- webservice 之一 php SOAP
- php SPL学习笔记
- php 自动加载类方法小结
- 非Windows操作系统导入ThinkPHP.php出错
- 腾讯云服务器配置ftp~【首发】
- php protobuf
- thinkphp集成系列之短信验证码、订单通知
- PHP CURD实现的中$_GET和$_POST用法的小问题
- 快速创建yii2 RESTful api的小记
- PHP操作数据库类
- thinkphp中去掉index.php