PHP经验分享

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

2019-12-01  本文已影响0人  小马别过河
应用场景

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

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. 输出


    输出
上一篇下一篇

猜你喜欢

热点阅读