PHP:设计模式之策略模式
2017-03-14 22:48
495 查看
策略模式是一种行为类模式。行为类模式用来说明一个应用是如何运作的。作为对比,工厂模式会改变对象的类型,而策略模式会立即改变一个算法。当我们使用的类比较简单,但是又不相互关联,只是在特定行为上有差异的时候,策略模式就非常有用。
举个例子,做一个字符串的过滤系统。不同的过滤系统需要包括:
1、删除HTML多余的空格
2、去除脏话
3、捕捉通过联系表单或者类似的地方发布垃圾信息(spam)的字符组合
这3种方式有一个共同点,那就是都作用于字符串。除此之外,无任何共同点,这会让我们从一个通用的基类继承子类是合理的。 这些过滤器应该立即被应用生效。举个例子,一个应用程序要设置在文本中的什么地方允许有或没有HTML代码或脏话出现。这种情况就是使用策略模式的比较好的场景。
接下来以多维数组排序为例,并且使用对象来实现它,为了使这个算法尽量被重用,每个算法将通过构造函数的参数来调整它的行为。
接下来把iSort策略模式应用到一个多维数组上:
运行结果:
举个例子,做一个字符串的过滤系统。不同的过滤系统需要包括:
1、删除HTML多余的空格
2、去除脏话
3、捕捉通过联系表单或者类似的地方发布垃圾信息(spam)的字符组合
这3种方式有一个共同点,那就是都作用于字符串。除此之外,无任何共同点,这会让我们从一个通用的基类继承子类是合理的。 这些过滤器应该立即被应用生效。举个例子,一个应用程序要设置在文本中的什么地方允许有或没有HTML代码或脏话出现。这种情况就是使用策略模式的比较好的场景。
接下来以多维数组排序为例,并且使用对象来实现它,为了使这个算法尽量被重用,每个算法将通过构造函数的参数来调整它的行为。
interface iSort { function sort(array $list); } class MultiSort implements iSort { private $_order; private $_index; function __construct($index, $order) { $this->_order = $order; $this->_index = $index; } function sort(array $list) { if ($this->_order == 'ascending') { uasort($list, array($this, 'ascSort')); } else { uasort($list, array($this, 'descSort')); } return $list; } function ascSort($x, $y) { return strcasecmp($x[$this->_index], $y[$this->_index]); } function descSort($x, $y) { return strcasecmp($y[$this->_index], $x[$this->_index]); } }
接下来把iSort策略模式应用到一个多维数组上:
require('iSort.php'); class StudentsList { private $_students = array(); function __construct($list) { $this->_students = $list; } function sort(iSort $type) { $this->_students = $type->sort($this->_students); } function display(){ echo "<ol>"; foreach ($this->_students as $student) { echo "<li>".$student['name'].":".$student['grade']."</li>"; } echo "</ol>"; } } $students = array( 256 => array('name' => 'John', 'grade' => 98), 23 => array('name' => 'Tom', 'grade' => 85), 9 => array('name' => 'Steve', 'grade' => 94), 363 => array('name' => 'Robert', 'grade' => 83), 69 => array('name' => 'Jack', 'grade' => 78) ); $list = new StudentsList($students); $list->sort(new MultiSort('name', 'ascending')); echo "<h2>按字母排序</h2>"; $list->display(); $list->sort(new MultiSort('grade', 'ascending')); echo "<h2>按成绩排序</h2>"; $list->display();
运行结果:
相关文章推荐
- PHP设计模式实例之(观察者模式、策略模式、简单工厂模式)
- 【PHP设计模式】策略模式
- PHP设计模式(5)策略模式
- PHP草根论之设计模式-策略模式
- PHP设计模式之:策略模式
- 学习php设计模式 php实现策略模式(strategy)
- PHP设计模式——策略模式
- php 设计模式-策略模式
- PHP设计模式9-策略模式
- PHP设计模式--策略模式
- php设计模式 Strategy(策略模式)
- 设计模式php实例:策略模式
- PHP设计模式之策略模式
- PHP设计模式之策略模式
- PHP设计模式实例之(观察者模式、策略模式、简单工厂模式)
- php设计模式 Strategy(策略模式)
- Php设计模式之【策略模式Strategy Pattern】
- PHP设计模式系列 - 策略模式
- PHP设计模式之策略模式
- PHP设计模式-策略模式