设计模式(一):策略模式(strategy)

应用场景

一般是用来根据不同的场景,来实现不同的策略。比如,公司在双十一做活动,某些商品打折,活动结束后,回复原本的价格。这时候,策略模式就很方便了。

UML图
策略模式UML.jpg

策略(Strategy)

定义所有支持的算法的公共接口。 Context 使用这个接口来调用某 ConcreteStrategy 定义的算法。

策略实现(ConcreteStrategy)

以 Strategy 接口实现某具体算法

上下文(Context)

用一个 ConcreteStrategy 对象来装配, 维护一个 Strategy 对象的引用,可定义一个接口让 Strategy 访问它的数据

代码实现(PHP)
  1. 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;
    }
}
  1. context.php (上下文类)
<?php
require './strategy.php';
// 上下文
class Context
{
    private $strategy;

    public function __construct(Strategy $strategy)
    {
        // 传一个策略进来
        $this->strategy = $strategy;
    }

    public function contextInterface()
    {
        $this->strategy->AlgorithmInterface();
    }
}
  1. 调用示例 (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();
  1. 输出


    输出
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容