PHP系列 - 4: 策略模式

更新於 發佈於 閱讀時間約 5 分鐘

工程師在工作一段時間後,隨著專案規模的擴大,難免會發現一些可以優化和調整的項目。此時,我們常聽到的「重構」就會浮上檯面。不過由於重構的內容與方法有很多,我目前也不打算開一個系列來詳細介紹,因此在這裡我將專注於介紹一個無論是在重構還是一般功能設計時都可能會用到的內容——「策略模式」。

介紹

策略模式(Strategy Pattern)是一種行為型設計模式,其目的是定義一系列函數,並將每個函數封裝成策略,以便它們可以互相替換。聽起來可能有點複雜,不如我們直接來看一個例子吧。

舉例

假設我們現在想要執行的策略類型是計算,接著我們可以計算的策略,例如加減乘除。

interface Strategy {
public function execute($a, $b);
}
// 設定策略種類
class Addition implements Strategy {
public function execute($a, $b) {
return $a + $b;
}
}

class Subtraction implements Strategy {
public function execute($a, $b) {
return $a - $b;
}
}
// 使用策略
class Context {
private $strategy;

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

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

public function executeStrategy($a, $b) {
return $this->strategy->execute($a, $b);
}
}

// 創建實例去使用
$context = new Context(new Addition());
echo $context->executeStrategy(5, 3); // 輸出 8

$context->setStrategy(new Subtraction());
echo $context->executeStrategy(5, 3); // 輸出 2

$context->setStrategy(new Multiplication());
echo $context->executeStrategy(5, 3); // 輸出 15

使用注意事項

唯一且重要的關鍵在於,這些策略必須具有相同的輸入和輸出類型。這樣可以在選擇策略時保持一致性,讓使用過程更加方便。

此外,在實作時,我們可以先將所有函數統一為相同的輸入和輸出模式,然後再將它們逐步整合成策略模式。這樣的過程會使得實現更加簡單明瞭,降低錯誤的可能性。

優點

  1. 提高可維護性:因為每個策略都被獨立封裝,當我們需要調整現有策略時,不必擔心會影響到其他策略的行為。
  2. 減少條件語句:策略模式可以大量減少程式碼中的 if-elseswitch 判斷式,從而使程式碼更加簡潔明瞭。
  3. 易於測試:由於每個策略都封裝成獨立的函數,這使得撰寫單元測試變得更加容易,能夠單獨測試每個策略的行為。

其他

使用策略模式的情境通常是因為存在許多相似需求(如相同的輸入輸出)或相似的處理方式,這會導致維護困難和易讀性差。通過採用策略模式,可以有效減少程式碼重複,從而提高靈活性和可維護性。

參考資料:

  1. https://refactoring.guru/design-patterns/strategy/php/example#example-0
avatar-img
2會員
27內容數
test
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
林柏宇的沙龍 的其他內容
本文介紹了一些在 PHP 中常用的函數,如匿名函數、isset()、empty() 和 is_null(),並解釋了可變變數、引用賦值及 array 的建立方法。此外,還提到 PHP 8.0 中的新特性 Nullsafe,幫助開發者更方便地處理空值判斷。
在本文中,我們將介紹PHP中的各種屬性與方法,包括訪問修飾符、方法修飾符,以及魔術方法的使用。你將學習到public、private和protected的區別,以及static、final、abstract等方法的特點。同時,我們會簡要提到PHP 8.1中新增的readonly屬性修飾符及其用途。
本文將介紹一些在 PHP 開發過程中實用的工具和技巧,涵蓋 PHP 分析器 xhprof、PHP 沙盒、PHP_CodeSniffer、PHPDoc 註解及靜態分析工具 PHPStan 等。這些工具能夠幫助開發者提高效率、減少錯誤,並改善程式碼的可讀性。
在軟體開發中,客戶經常會遇到無法訪問公司網頁的問題,但這類問題常常難以從日誌中查找解決方案。本文探討了有效的解決方式,特別是利用HTTP Archive(HAR)檔案來分析問題根本,幫助客戶瞭解問題的來源,包括使用有用的工具來進行資訊解析。透過案例與經驗分享,讓讀者能更有效地應對類似挑戰。
在這篇文章中,我們將探討常見的下載中斷問題,尤其針對高畫質影片或大檔案的傳輸困難。通過問題描述與解析,我們發現影響下載成功的因素,並提出利用 byte-range 技術進行分段傳輸的解決方案。此外,也會說明調整 header 的重要性,幫助開發者有效改善用戶下載體驗。
在軟體工程中,文件管理常被忽視,但對於多方協作至關重要。本文深入探討API文件、YAML格式和UML圖的應用,強調保持文件的版本控制,使用Swagger和Markdown工具提升可讀性與協作效率。此外,我們將討論如何利用PlantUML輕鬆繪製UML圖,以促進開發團隊之間的有效溝通與理解。
本文介紹了一些在 PHP 中常用的函數,如匿名函數、isset()、empty() 和 is_null(),並解釋了可變變數、引用賦值及 array 的建立方法。此外,還提到 PHP 8.0 中的新特性 Nullsafe,幫助開發者更方便地處理空值判斷。
在本文中,我們將介紹PHP中的各種屬性與方法,包括訪問修飾符、方法修飾符,以及魔術方法的使用。你將學習到public、private和protected的區別,以及static、final、abstract等方法的特點。同時,我們會簡要提到PHP 8.1中新增的readonly屬性修飾符及其用途。
本文將介紹一些在 PHP 開發過程中實用的工具和技巧,涵蓋 PHP 分析器 xhprof、PHP 沙盒、PHP_CodeSniffer、PHPDoc 註解及靜態分析工具 PHPStan 等。這些工具能夠幫助開發者提高效率、減少錯誤,並改善程式碼的可讀性。
在軟體開發中,客戶經常會遇到無法訪問公司網頁的問題,但這類問題常常難以從日誌中查找解決方案。本文探討了有效的解決方式,特別是利用HTTP Archive(HAR)檔案來分析問題根本,幫助客戶瞭解問題的來源,包括使用有用的工具來進行資訊解析。透過案例與經驗分享,讓讀者能更有效地應對類似挑戰。
在這篇文章中,我們將探討常見的下載中斷問題,尤其針對高畫質影片或大檔案的傳輸困難。通過問題描述與解析,我們發現影響下載成功的因素,並提出利用 byte-range 技術進行分段傳輸的解決方案。此外,也會說明調整 header 的重要性,幫助開發者有效改善用戶下載體驗。
在軟體工程中,文件管理常被忽視,但對於多方協作至關重要。本文深入探討API文件、YAML格式和UML圖的應用,強調保持文件的版本控制,使用Swagger和Markdown工具提升可讀性與協作效率。此外,我們將討論如何利用PlantUML輕鬆繪製UML圖,以促進開發團隊之間的有效溝通與理解。
你可能也想看
Google News 追蹤
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
企業面對大專案時,將其分解成可執行的小任務,有助於實現目標。以提升銷售額為例,拆解為四個要素,並提供增加流量、轉換率、客單價和回購率的策略。另外,還必須設計可量化的指標及追蹤回饋。這些建議對於創作型工作和知識型工作者來說,同樣可以利用該策略來提高工作效率。
Thumbnail
書中介紹策略顧問的幾個核心思考脈絡與方法,透過書中所教的思考脈絡與問題解決三大支柱:批判思考、邏輯思考、假說思考,掌握問題20%的關鍵,一一拆解並解決至少80%的問題!
Thumbnail
這篇文章著重於解釋軟體專案管理中的戰略意義和專案特性評估,並提出了四個不同像限的專案特性。
Thumbnail
追求乾淨的程式碼是好的開始,但不要陷入過度設計的陷阱,導致程式難以維護。實際上,考慮團隊狀況和專注於解決真正的問題更為重要。了解公司的規模和現實情況,適時調整工作重心。技術不斷進步,使得寫程式變得更加容易,但這並不意味著工程師的角色會消失。在選擇技術時,也要考慮隱形成本有時簡單的解決方案反而更有效。
Thumbnail
其實流程不是不能改,只是考量要長遠、考慮周到。財會工作就是搜集、整理、統計、分析資料,不是只「記帳」而已,任何流程的建立都是為了能便於分析,快速找到問題。如果沒有意識到這一點,就是連自己也輕看自己的工作了。
策略規劃怎麼做?專案管理怎麼規劃流程?做好前期策略流程準備,專案團隊才能一直朝著共同目標前進!跟著我們一起 5 步學會規劃專案策略,從確立目標開始,照著範例一步步進行環境分析,掌握關鍵策略選項和計劃制定高效工具,隨時監控KPIs完成情況!還有免費工具推薦,讓你可以一鍵生成策略流程圖!
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
企業面對大專案時,將其分解成可執行的小任務,有助於實現目標。以提升銷售額為例,拆解為四個要素,並提供增加流量、轉換率、客單價和回購率的策略。另外,還必須設計可量化的指標及追蹤回饋。這些建議對於創作型工作和知識型工作者來說,同樣可以利用該策略來提高工作效率。
Thumbnail
書中介紹策略顧問的幾個核心思考脈絡與方法,透過書中所教的思考脈絡與問題解決三大支柱:批判思考、邏輯思考、假說思考,掌握問題20%的關鍵,一一拆解並解決至少80%的問題!
Thumbnail
這篇文章著重於解釋軟體專案管理中的戰略意義和專案特性評估,並提出了四個不同像限的專案特性。
Thumbnail
追求乾淨的程式碼是好的開始,但不要陷入過度設計的陷阱,導致程式難以維護。實際上,考慮團隊狀況和專注於解決真正的問題更為重要。了解公司的規模和現實情況,適時調整工作重心。技術不斷進步,使得寫程式變得更加容易,但這並不意味著工程師的角色會消失。在選擇技術時,也要考慮隱形成本有時簡單的解決方案反而更有效。
Thumbnail
其實流程不是不能改,只是考量要長遠、考慮周到。財會工作就是搜集、整理、統計、分析資料,不是只「記帳」而已,任何流程的建立都是為了能便於分析,快速找到問題。如果沒有意識到這一點,就是連自己也輕看自己的工作了。
策略規劃怎麼做?專案管理怎麼規劃流程?做好前期策略流程準備,專案團隊才能一直朝著共同目標前進!跟著我們一起 5 步學會規劃專案策略,從確立目標開始,照著範例一步步進行環境分析,掌握關鍵策略選項和計劃制定高效工具,隨時監控KPIs完成情況!還有免費工具推薦,讓你可以一鍵生成策略流程圖!