PHP策略模式定義與用法實例詳解

巴扎黑
發布: 2023-03-15 20:28:01
原創
1306 人瀏覽過

這篇文章主要介紹了PHP策略模式定義與用法,結合實例形式簡單分析了php策略模式的原理、實現與使用方法,需要的朋友可以參考下

本文實例講述了PHP策略模式定義與用法。分享給大家供大家參考,具體如下:

概述

策略模式屬於物件的行為模式。其用意是針對一組演算法,將每個演算法封裝到具有共同介面的獨立的類別中,從而使得它們可以相互替換。策略模式使得演算法可以在不影響到客戶端的情況下發生變化

UML圖

策略模式中主要角色

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

環境角色(Context):持有一個Strategy的引用
抽象策略(Strategy)角色:這是一個抽象角色,通常由一個介面或抽象類別實作。此角色給出所有的具體的策略類別所需的介面
具體策略(ConcreateStrategy)角色:包裝了相關的演算法或行為

##使用場景

假設現在要設計一個購物車系統,一個最簡單的情況就是把所有貨品的單價乘上數量,但是實際情況肯定比這個複雜。例如:對一般會員無折扣,對中級會員提供20折優惠,高級會員提供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;
?>
登入後複製

#回顧策略模式

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

演算法的平等性

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

#運行時策略的唯一性

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

以上是PHP策略模式定義與用法實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板