應(yīng)用場景
一般是用來根據(jù)不同的場景,來實現(xiàn)不同的策略。比如,公司在雙十一做活動,某些商品打折,活動結(jié)束后,回復(fù)原本的價格。這時候,策略模式就很方便了。
UML圖

策略模式UML.jpg
策略(Strategy)
定義所有支持的算法的公共接口。 Context 使用這個接口來調(diào)用某 ConcreteStrategy 定義的算法。
策略實現(xiàn)(ConcreteStrategy)
以 Strategy 接口實現(xiàn)某具體算法
上下文(Context)
用一個 ConcreteStrategy 對象來裝配, 維護一個 Strategy 對象的引用,可定義一個接口讓 Strategy 訪問它的數(shù)據(jù)
代碼實現(xiàn)(PHP)
- strategy.php (策略類)
<?php
// 抽象策略類
abstract class Strategy
{
//抽象算法,讓不同的策略實現(xiàn)
public abstract function AlgorithmInterface();
}
//具體的策略類
class ConcreteStrategyA extends Strategy
{
public function AlgorithmInterface()
{
// TODO: Implement AlgorithmInterface() method.
echo "A策略實現(xiàn)", PHP_EOL;
}
}
class ConcreteStrategyB extends Strategy
{
public function AlgorithmInterface()
{
// TODO: Implement AlgorithmInterface() method.
echo "B策略實現(xiàn)", PHP_EOL;
}
}
class ConcreteStrategyC extends Strategy
{
public function AlgorithmInterface()
{
// TODO: Implement AlgorithmInterface() method.
echo "C策略實現(xiàn)", PHP_EOL;
}
}
- context.php (上下文類)
<?php
require './strategy.php';
// 上下文
class Context
{
private $strategy;
public function __construct(Strategy $strategy)
{
// 傳一個策略進(jìn)來
$this->strategy = $strategy;
}
public function contextInterface()
{
$this->strategy->AlgorithmInterface();
}
}
- 調(diào)用示例 (main.php)
<?php
require_once './context.php';
require_once './strategy.php';
//調(diào)用示例
$context = new Context(new ConcreteStrategyA());
$context->contextInterface();
$context= new Context(new ConcreteStrategyB());
$context->contextInterface();
$context = new Context(new ConcreteStrategyC());
$context->contextInterface();
-
輸出
輸出
