策略模式

策略模式

  • 定义一组相同类型的算法,算法之间独立封装,并且可以互相代替。
  • 这些算法是统一类型问题的多种处理方式,但是具体行为存在差别。
  • 每一个算法、或者说每一种处理方式称为一个策略。
  • 在应用中,就可以根据环境的不同,选择不同的策略来处理问题。
    • 实例代码
    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
2
3
4
5
6
7
{"title":"title = cd_1","info":"info = cd_1"}
<?xml version="1.0" encoding="utf-8"?>
<return>
<data>
a:2:{s:5:"title";s:12:"title = cd_1";s:4:"info";s:11:"info = cd_1";}
</data>
</return>
  • 策略模式帮助构建的对象不必包含吱声逻辑,而是能够根据需要利用其它对象中的算法。
  • 策略设计模式详细说明了一个对象的构造,从而通过去除对象本省的复杂逻辑而使该对象简介。测试,这个对象不必再内部包含一组逻辑,而是可以在运行中调用其他类的算法。
    • 不是用策略模式实现以上功能
    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;
  • 虽然一样可以实现,但是如果是一个负责方案,包括大量的处理逻辑需要封装,或者处理方式变动较大,则咎显得混乱。
  • 所以使用策略模式将方案分离开来(一个类一个文件,新需求添加类即可),让操作者根据具体的需求,动态的选择不同的策略方案。