策略模式
策略模式定义一系列算法,将每个算法封装起来,并让它们可以互相替换,策略模式让算法的变化不会
影响到使用它的客户。策略模式是一种对象行为型模式。
步骤组成:
抽象策略角色:策略类,通常由一个接口抽或象类实现
具体策略角色:封装了相关算法和行为,具体实现父类的共同方法
环境角色:接收保存实例,统一执行策略类接口方法
应用场景:
多个类只区别在表现行为不同,在运行时动态选择具体要执行的行为
对客户隐藏具体算法的实现细节,彼此完全独立
需要在不同情况下使用不同算法
优点:
策略模式提供了管理相关算法的办法,恰当使用继承可以把公共代码写入父类,避免重复代码
每个算法都有自己单独的类,可以通过自己单独的接口进行测试,简化了单元测试。
缺点:
客户端必须知道所有的策略类,并自行决定使用哪一个策略类,因此,策略模式只适用于客户端知道所有算法
或行为的情况下。策略模式会造成很多策略类,每个具体策略类会产生一个新类。
具体实现
<?php
/**
* 抽象策略角色,以接口实现
*/
interface Strategy {
/**
* 算法接口
*/
public function algorithmInterface();
}
/**
* 具体策略角色A
*/
class ConcreteStrategyA implements Strategy {
public function algorithmInterface() {
echo 'algorithmInterface A<br />';
}
}
/**
* 具体策略角色B
*/
class ConcreteStrategyB implements Strategy {
public function algorithmInterface() {
echo 'algorithmInterface B<br />';
}
}
/**
* 具体策略角色C
*/
class ConcreteStrategyC implements Strategy {
public function algorithmInterface() {
echo 'algorithmInterface C<br />';
}
}
/**
* 环境角色
*/
class Context {
/* 引用的策略 */
private $_strategy;
public function __construct(Strategy $strategy) {
$this->_strategy = $strategy;
}
public function contextInterface() {
$this->_strategy->algorithmInterface();
}
}
/**
* 客户端
*/
class Client {
/**
* Main program.
*/
public static function main() {
$strategyA = new ConcreteStrategyA();
$context = new Context($strategyA);
$context->contextInterface();
$strategyB = new ConcreteStrategyB();
$context = new Context($strategyB);
$context->contextInterface();
$strategyC = new ConcreteStrategyC();
$context = new Context($strategyC);
$context->contextInterface();
}
}
Client::main();
?>
网友评论