标签:
<?php
interface IStrategy
{
function filter( $record );
}//定义一个接口
class FindNameWithA implements IStrategy//实现接口
{
public function filter($record)
{
$record = strtolower($record);//变换成小写
if (strpos($record, ‘a‘)!==false) {//返回record中a出现在第几个,这里是看是否有a这个字母
return true;
}
return false;
}
}
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);
$f3 = $ul->find(new FindNameWithA());
print_r($f3);
先对上述例子进行分析,先设置几种策略,这几种策略是对字符串进行操作的几种方式。分别有找出含有a的,找出含有?的,?作为参数传入,还有随即找出一个。
这几个策略都写成类。主类写成一个含有添加字符串功能的类,还有一个是对字符串的操作方法,在这个操作方法中传入一个策略的对象作为参数。在方法里面调用这个参数对象内的字符串处理方法(除此还有一个构造方法),然后输出结果。
大体思路。1.写几个策略
2.在主类的字符串处理函数中加入策略对象作为参数。
3.所有策略都有一个同名的方法(实现一个接口),在主类中需要处理字符串的位置用 处理函数的参数(策略对象)->策略中公共的处理字符串的函数的名字 的方式来调用
4.这个时候只需要实例化一个主类(同时已经包含一个数组),用对象->方法的方式来调用主类中的字符串处理函数,传入需要的策略的对象,这时会自动调用这个策略对象的字符串处理函数。
标签:
原文地址:http://www.cnblogs.com/tobemaster/p/5767107.html