设计模式(一):策略模式(strategy)
2019-12-01 本文已影响0人
小马别过河
应用场景
一般是用来根据不同的场景,来实现不同的策略。比如,公司在双十一做活动,某些商品打折,活动结束后,回复原本的价格。这时候,策略模式就很方便了。
UML图
策略模式UML.jpg策略(Strategy)
定义所有支持的算法的公共接口。 Context 使用这个接口来调用某 ConcreteStrategy 定义的算法。
策略实现(ConcreteStrategy)
以 Strategy 接口实现某具体算法
上下文(Context)
用一个 ConcreteStrategy 对象来装配, 维护一个 Strategy 对象的引用,可定义一个接口让 Strategy 访问它的数据
代码实现(PHP)
- strategy.php (策略类)
<?php
// 抽象策略类
abstract class Strategy
{
//抽象算法,让不同的策略实现
public abstract function AlgorithmInterface();
}
//具体的策略类
class ConcreteStrategyA extends Strategy
{
public function AlgorithmInterface()
{
// TODO: Implement AlgorithmInterface() method.
echo "A策略实现", PHP_EOL;
}
}
class ConcreteStrategyB extends Strategy
{
public function AlgorithmInterface()
{
// TODO: Implement AlgorithmInterface() method.
echo "B策略实现", PHP_EOL;
}
}
class ConcreteStrategyC extends Strategy
{
public function AlgorithmInterface()
{
// TODO: Implement AlgorithmInterface() method.
echo "C策略实现", PHP_EOL;
}
}
- context.php (上下文类)
<?php
require './strategy.php';
// 上下文
class Context
{
private $strategy;
public function __construct(Strategy $strategy)
{
// 传一个策略进来
$this->strategy = $strategy;
}
public function contextInterface()
{
$this->strategy->AlgorithmInterface();
}
}
- 调用示例 (main.php)
<?php
require_once './context.php';
require_once './strategy.php';
//调用示例
$context = new Context(new ConcreteStrategyA());
$context->contextInterface();
$context= new Context(new ConcreteStrategyB());
$context->contextInterface();
$context = new Context(new ConcreteStrategyC());
$context->contextInterface();
-
输出
输出