+ -
当前位置:首页 → 问答吧 → PHP学习模式笔记——策略模式

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之类的结果。
策略模式非常适合复杂数据管理系统或数据处理系统,二者在数据筛选、搜索或处理的方面需要较高的灵活性。

作者: 星汉   发布时间: 2011-10-06

我是沙发。。。。

作者: xifan   发布时间: 2011-10-07