PHP 模式大全 - 策略模式

ChenAfrica發表於2022-01-26

簡介

策略模式可以在程式運作時更改其行為或演算法,你可以通過切換策略來改變另一種演算法,你需要一個介面來達代表這個策略類,然後在主要類當中去申明這個介面策略類,在需要變更時切換哪種策略來達成不同狀態下所需要的功能。舉個簡單的例子:小明同學需要計算3加4等於幾的問題? 可以有多種方式去算這個題目,方法一、 計算器輸入計算 方法二、鉛筆計算 …., 這種運算的方式就可以抽離出來作為策略。

實現方式

  1. 首先我們定義一個統一的策略排程器 Strategy.php
/**
 * Interface Strategy.
 */
interface Strategy
{
    /**
     * @return int
     */
     public function calculatePrice(int $price, int $count): int;
}
  1. 接下來逐個實現策略
    WithCalculator.php

    class WithCalculator  implements Strategy
    {
       public function calculate(int $a, int $b) 
      {
           return $a + $b;
      }
    }

    WithPencial.php

    class WithPencial implements Strategy
    {
       public function calculate(int $a, int $b) 
       {
            return $a + $b;
       }
    }
  2. 最後需要一個大類
    Calculate.php

    class Calculate
    {
      protected int $a;
      protected int $b;
      protected Strategy $strategy;
    
     public  function  __construct(int $a, int $b, Strategy $strategy) 
     { 
          $this->a = $a; 
          $this->b = $b; 
          $this->strategy = $strategy;
     }
    
    public function changeStrategy(Strategy $strategy)
    {
          $this->strategy = $strategy;
    }
    
    public function calculate() 
    {
          return $this->strategy->calculate($this->a, $this->b);
    }
    }

    測試

    class StrategyTest extends TestCase
    {
     /** * @test */
     public function test_strategy()
     {
         $calculate = new Calculate(3, 4, new WithCalculator); 
         $this->assertEquals(7, $calculate->calculate()); 
     }
    }
    

```

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章