策略模式
策略模式
Alex策略模式
- 定义一组相同类型的算法,算法之间独立封装,并且可以互相代替。
- 这些算法是统一类型问题的多种处理方式,但是具体行为存在差别。
- 每一个算法、或者说每一种处理方式称为一个策略。
- 在应用中,就可以根据环境的不同,选择不同的策略来处理问题。
- 实例代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36<?php
//策略模式
//cd类
class Cd {
protected $cdArr;
public function __construct($title, $info) {
$this->cdArr['title'] = $title;
$this->cdArr['info'] = $info;
}
public function getCd($typeObj) {
return $typeObj->get($this->cdArr);
}
}
class json {
public function get($return_data) {
return json_encode($return_data);
}
}
class xml {
public function get($return_data) {
$xml = '<?xml version="1.0" encoding="utf-8"?>';
$xml .= '<return>';
$xml .= '<data>' .serialize($return_data). '</data>';
$xml .= '</return>';
return $xml;
}
}
$cd = new Cd('title = cd_1', 'info = cd_1');
echo $cd->getCd(new json);
echo $cd->getCd(new xml);
- 输出:
1 | {"title":"title = cd_1","info":"info = cd_1"} |
- 策略模式帮助构建的对象不必包含吱声逻辑,而是能够根据需要利用其它对象中的算法。
- 策略设计模式详细说明了一个对象的构造,从而通过去除对象本省的复杂逻辑而使该对象简介。测试,这个对象不必再内部包含一组逻辑,而是可以在运行中调用其他类的算法。
- 不是用策略模式实现以上功能
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30//不使用策略模式实现
class Output
{
public function render($array, $type = '')
{
if ($type === 'xml') {
$xml = '<?xml version="1.0" encoding="utf-8"?>';
$xml .= '<return>';
$xml .= '<data>' .serialize($array). '</data>';
$xml .= '</return>';
$xml .= '</return>';
return $xml;
} elseif ($type === 'json') {
return json_encode($array);
} else {
return $array;
}
}
}
$test = array('a','b','c');
$output = new Output();
$data = $output->render($test, 'array');
$data = $output->render($test, 'xml');
echo $data;
$data = $output->render($test, 'json');
echo "\n";
echo $data; - 虽然一样可以实现,但是如果是一个负责方案,包括大量的处理逻辑需要封装,或者处理方式变动较大,则咎显得混乱。
- 所以使用策略模式将方案分离开来(一个类一个文件,新需求添加类即可),让操作者根据具体的需求,动态的选择不同的策略方案。