糯米文學吧

位置:首頁 > 計算機 > php語言

PHP策略模式定義與用法

php語言2.98W

策略模式屬於對象的行為模式。其用意是針對一組算法,將每個算法封裝到具有共同接口的獨立的類中,從而使得它們可以相互替換。下面是小編分享的PHP策略模式定義與用法,一起來看一下吧。

PHP策略模式定義與用法

  策略模式中主要角色

這個模式設計到三個角色:

環境角色(Context):持有一個Strategy的.引用

抽象策略(Strategy)角色:這是一個抽象角色,通常由一個接口或抽象類實現。此角色給出所有的具體的策略類所需的接口

具體策略(ConcreateStrategy)角色:包裝了相關的算法或行為

  使用場景

假設現在要設計一個購物車系統,一個最簡單的情況就是把所有貨品的單價乘上數量,但是實際情況肯定比這個複雜。例如:對普通會員無折扣,對中級會員提供8折優惠,對高級會員提供7折優惠。

根據上述描述,貨品價格是根據以下幾個算法中的一個進行的:

對普通會員無折扣

對中級會員8折

對高級會員7折

  UML圖


  實現代碼:

<?php

/**

* 策略抽象類

* @author wzy

*

*/

interface Strategy

{

public function calPrice ($price);

}

/**

* 普通會員策略類

*

* @author wzy

*

*/

class PrimaryStrategy implements Strategy

{

public function calPrice ($price)

{

echo "普通會員無折扣";

return $price;

}

}

/**

* 中級會員策略類

*

* @author wzy

*

*/

class MiddleStrategy implements Strategy

{

public function calPrice ($price)

{

echo "中級會員8折優惠";

return $price * 0.8;

}

}

/**

* 高級會員策略類

*

* @author wzy

*

*/

class HighStrategy implements Strategy

{

public function calPrice ($price)

{

echo "高級會員7折優惠";

return $price * 0.7;

}

}

/**

* Context實現類

*

* @author wzy

*

*/

class Price

{

/**

* 具體的策略類對象

*

* @var object

*/

private $strategyInstance;

/**

* 構造函數,傳入一個具體的策略對象

*

* @param object $instance

*/

public function __construct ($instance)

{

$this->strategyInstance = $instance;

}

/**

* 計算貨品的價格

*

* @param double $price

*/

public function quote ($price)

{

return $this->strategyInstance->calPrice($price);

}

}

/**

* 客户端操作

*/

$high = new HighStrategy();

$priceClass = new Price($high);

$price = $priceClass->quote(400);

echo $price;

?>

回顧策略模式

策略模式的重心不是如何實現算法,而是如何組織、調用這些算法,從而讓程序結構更靈活,具有更好的擴展性和維護

算法的平等性

策略模式一個很大的特點就是各個策略算法的平等性。對於一系列具體的策略算法,大家的地位是一樣的,這樣才能實現算法之間的互相轉換

運行時策略的唯一性

運行期間,策略模式在每一個時刻只能使用一個具體的策略實現對象,雖然可以動態地在不同的策略實現中切換,但是同時只有一個。