策略模式

策略模式

  • 定义一组相同类型的算法,算法之间独立封装,并且可以互相代替。
  • 这些算法是统一类型问题的多种处理方式,但是具体行为存在差别。
  • 每一个算法、或者说每一种处理方式称为一个策略。
  • 在应用中,就可以根据环境的不同,选择不同的策略来处理问题。
  • 实例代码
<?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);

  • 输出:
{"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>
  • 策略模式帮助构建的对象不必包含吱声逻辑,而是能够根据需要利用其它对象中的算法。
  • 策略设计模式详细说明了一个对象的构造,从而通过去除对象本省的复杂逻辑而使该对象简介。测试,这个对象不必再内部包含一组逻辑,而是可以在运行中调用其他类的算法。
  • 不是用策略模式实现以上功能
//不使用策略模式实现
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;
  • 虽然一样可以实现,但是如果是一个负责方案,包括大量的处理逻辑需要封装,或者处理方式变动较大,则咎显得混乱。
  • 所以使用策略模式将方案分离开来(一个类一个文件,新需求添加类即可),让操作者根据具体的需求,动态的选择不同的策略方案。