PHP学习模式笔记——策略模式
时间:2011-10-06
来源:互联网
策略模式,算法是从复杂类中提取的,因而可以方便的替换。比如,要更改搜索引擎中排列页的方式,就可以选择策略模式。搜索引擎的几部分:一部分遍历页面,一部分对每页排列,另一部分基于排列的结果排序。通过使用策略模式,刻意把排列部分放入另一个类中,以便更改页的排列方式,而不影响搜索引擎的其他代码。
PHP代码示例:
<?php
interface IStrategy
{
function filter($record);
}
class FindAfterStrategy implements IStrategy
{
private $_name;
public function _construct($name)
{
this->_name=$name;
}
public function filter($record)
{
return strcmp($this->_name,$record) <=0;
}
}
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);
?>
UserList类是打包名称数组的一个包装器,它实现find方法,该方法利用几个策略之一来选择这些名称的子集。这些策略由IStrategy接口定义,该接口有两个实现:一个随机选择用户,另一个根据指定名称选择其后的所有名称。
测试代码为两个策略运行同一用户表,并显示结果。在第一种情况中,策略查找排列在J后的任何名称,所以将得到Jack、Lori和Megan。第二个策略随机选取名称,每次会产生不同的结果。在这种情况下,结果随机显示如Andy和Megan之类的结果。
策略模式非常适合复杂数据管理系统或数据处理系统,二者在数据筛选、搜索或处理的方面需要较高的灵活性。
PHP代码示例:
<?php
interface IStrategy
{
function filter($record);
}
class FindAfterStrategy implements IStrategy
{
private $_name;
public function _construct($name)
{
this->_name=$name;
}
public function filter($record)
{
return strcmp($this->_name,$record) <=0;
}
}
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);
?>
UserList类是打包名称数组的一个包装器,它实现find方法,该方法利用几个策略之一来选择这些名称的子集。这些策略由IStrategy接口定义,该接口有两个实现:一个随机选择用户,另一个根据指定名称选择其后的所有名称。
测试代码为两个策略运行同一用户表,并显示结果。在第一种情况中,策略查找排列在J后的任何名称,所以将得到Jack、Lori和Megan。第二个策略随机选取名称,每次会产生不同的结果。在这种情况下,结果随机显示如Andy和Megan之类的结果。
策略模式非常适合复杂数据管理系统或数据处理系统,二者在数据筛选、搜索或处理的方面需要较高的灵活性。
作者: 星汉 发布时间: 2011-10-06
我是沙发。。。。
作者: xifan 发布时间: 2011-10-07
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28