文档章节

设计模式——策略模式

伈猿意码
 伈猿意码
发布于 2017/03/28 23:26
字数 499
阅读 25
收藏 2

策略模式:定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。也称为政策模式(Policy)。策略模式把对象本身和运算规则区分开来,其功能非常强大,因为这个设计模式本身的核心思想就是面向对象编程的多形性的思想。 结构图

《深入理解PHP》里面的实例
1. 创建一个iSort.php类,用于封装多维数组排序方法

  • 多维数组按字符串排序
  • 多维数组按数字排序
<?php
interface iSort{
	function sort(array $list);
}

class MultiAlphaSort implements iSort{
	private $_order;
	private $_index;
	
	function __construct($index,$order = 'ascending'){
		$this->_index = $index;
		$this->_order = $order;
	}
	
	function sort(array $list){
		if($this->_order =='ascending'){
			uasort($list,array($this,'ascSort'));
		}else{
			uasort($list,array($this,'descSort'));
		}
		return $list;
	}//end of sort() method
	
	function ascSort($x,$y){
		return strcasecmp($x[$this->_index],$y[$this->_index]);
	}
	
	function descSort($x,$y){
		return strcasecmp($y[$this->_index],$x[$this->_index]);
	}
}//end of MultiAlphaSort

class MultiNumberSort implements iSort{
	private $_order;
	private $_index;
	
	function __construct($index,$order = 'ascending'){
		$this->_index = $index;
		$this->_order = $order;
	}
	
	function sort(array $list){
		if($this->_order =='ascending'){
			uasort($list,array($this,'ascSort'));
		}else{
			uasort($list,array($this,'descSort'));
		}
		return $list;
	}//end of sort() method
	
	function ascSort($x,$y){
		return ($x[$this->_index]>$y[$this->_index]);
	}
	
	function descSort($x,$y){
		return ($x[$this->_index]<$y[$this->_index]);
	}
}
?>

2. 创建一个StudentsList类,用于调用iSort

<?php
require('isSort.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>'.PHP_EOL;
		foreach($this->_students as $student){
			echo "<li>{$student['name']}->{$student['grade']}</li>".PHP_EOL;
		}
		echo '</ol>'.PHP_EOL;
	}
}//end of StudentsList class

$students =array(
256=>array('name'=>'Jon','grade'=>98.5),
2=>array('name'=>'Vance','grade'=>85.1),
9=>array('name'=>'Stenphen','grade'=>94),
364=>array('name'=>'Steve','grade'=>85.1),
68=>array('name'=>'Rob','grade'=>74.6)
);
$list = new StudentsList($students);
echo '<h2>Original array</h2>'.PHP_EOL;
$list->display();

//sort by name
$list->sort(new MultiAlphaSort('name'));
echo '<h2>sort by name</h2>'.PHP_EOL;
$list->display();

//sort by Number
$list->sort(new MultiNumberSort('grade'));
echo '<h2>sort by Number</h2>'.PHP_EOL;
$list->display();

unset($list);
?>

显示的效果

Original array
Jon->98.5
Vance->85.1
Stenphen->94
Steve->85.1
Rob->74.6

sort by name
Jon->98.5
Rob->74.6
Stenphen->94
Steve->85.1
Vance->85.1

sort by Number
Rob->74.6
Vance->85.1
Steve->85.1
Stenphen->94
Jon->98.5

© 著作权归作者所有

伈猿意码
粉丝 5
博文 27
码字总数 9727
作品 0
广州
程序员
私信 提问

暂无文章

axios 使用步骤很简单,首先在前端项目中,引入 axios:

  前端网络访问,主流方案就是 Ajax,Vue 也不例外,在 Vue2.0 之前,网络访问较多的采用 vue-resources,Vue2.0 之后,官方不再建议使用 vue-resources ,这个项目本身也停止维护,目前建...

SEOwhywhy
22分钟前
2
0
c++ 创建对象的三种方法

c++有三种方法创建对象 结合代码来看 1 #include <iostream> 2 using namespace std; 3 class Test { 4 5 private: 6 public: 7 add() 8 { 9 ......

天王盖地虎626
36分钟前
1
0
ant 中的fileset include等拷贝

拷贝一个目录到指定目录下 例:<copy todir="${basedir}/new"> <fileset dir="${basedir}/old"> <include name="appgen" /> <include name="appgen/" /> <include name=appgen/**" /> <incl......

shzwork
42分钟前
2
0
react-jianshu项目的创建

创建项目 1、github上创建仓库react-jianshu 2、将项目克隆到本地git clone git@github.com:startjcu/react-jianshu.git 3、在当前目录(项目目录的上级目录)下执行create-react-app react-...

星闪海洋
51分钟前
2
0
OSChina 周二乱弹 —— 小哥哥,你可以教我写代码吗

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @nnnm: 生活大爆炸,结束了,这部陪伴了漫长时间的情景喜剧,最终是以诺贝尔奖和大团圆收尾的。虽然,不算精彩,但也是温馨。而少年谢尔顿的...

小小编辑
今天
663
13

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部