PHP設計模式—策略模式

 

定義:

策略模式(Strategy):它定義了算法家族,分別封裝起來,讓它們之間能夠互相替換,此模式讓算法的變化,不會影響到使用算法的客戶。php

 

結構:

  • Strategy(策略類):定義全部支持的算法的公共接口。
  • ConcreteStrategy(具體策略類):封裝了具體的算法或行爲,繼承於Strategy。
  • Context:Context上下文,用一個ConcreteStrategy來配置,維護一個對Strategy對象的引用。
  • Client:客戶端代碼。

 

代碼實例:

/**
 * Strategy.php(策略類)
 * Class Strategy
 */
abstract class Strategy
{
    /**
     * 算法方法
     */
    abstract public function doInterface();
}


/**
 * ConcreteStrategyA.php(具體策略類)
 * Class ConcreteStrategyA
 */
class ConcreteStrategyA extends Strategy
{
    /**
     * 算法A具體實現方法
     */
    public function doInterface()
    {
        // TODO: Implement doInterface() method.
        return "使用算法A\n";
    }
}


/**
 * ConcreteStrategyB.php(具體策略類)
 * Class ConcreteStrategyB
 */
class ConcreteStrategyB extends Strategy
{
    /**
     * 算法B具體實現方法
     */
    public function doInterface()
    {
        // TODO: Implement doInterface() method.
        return "使用算法B\n";
    }
}


/**
 * Class Context
 */
class Context
{
    private $strategy;

    public function __construct(Strategy $strategy)
    {
        $this->strategy = $strategy;
    }

    /**
     * 根據具體的策略對象,調用相應的算法的方法
     */
    public function getInterface()
    {
        return $this->strategy->doInterface();
    }
}

客戶端調用:算法

// 算法A
$strategyA = new Context(new ConcreteStrategyA());
echo $strategyA->getInterface();
echo '<br>';
// 算法B
$strategyB = new Context(new ConcreteStrategyB());
echo $strategyB->getInterface();

結果:this

使用算法A 
使用算法B

 

總結:

  • 策略模式是一種定義一系列算法的方法,從概念上來看,全部這些算法完成的都是相同的工做,只是實現不一樣,它能夠以相同的方式調用全部的算法,減小了各類算法類與使用算法類之間的耦合。
  • 策略模式的 Strategy 類層次爲 Context 定義了一系列的可供重用的算法或行爲。繼承有助於析取出這些算法中的公共功能。
  • 策略模式就是用來封裝算法的,但在實踐中,咱們發現能夠用它來封裝幾乎任何類型的規則,只要在分析過程當中聽到須要在不一樣時間應用不一樣的業務規則,就能夠考慮使用策略模式處理這種變化的可能性。
相關文章
相關標籤/搜索