标签:
<?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