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
留言分享你的想法!
avatar-img
林柏宇的沙龍
2會員
52內容數
test
林柏宇的沙龍的其他內容
2025/04/27
JWT(JSON Web Token)是基於 JSON 格式的開放標準,主要用於身份驗證與權限確認。本文介紹了JWT的基本結構,並闡述其特點,如降低資料庫壓力、靈活性及無狀態性。JWT 特別適用於分佈式系統。本篇將協助讀者深入理解 JWT 的重要性與實際應用。
Thumbnail
2025/04/27
JWT(JSON Web Token)是基於 JSON 格式的開放標準,主要用於身份驗證與權限確認。本文介紹了JWT的基本結構,並闡述其特點,如降低資料庫壓力、靈活性及無狀態性。JWT 特別適用於分佈式系統。本篇將協助讀者深入理解 JWT 的重要性與實際應用。
Thumbnail
2025/04/20
本文介紹了容器的基本概念、組成部分以及其在應用開發中的重要性,特別是對初階和高階工程師的影響。透過深入探討容器的優點,以及Docker、Kubernetes和ArgoCD等相關技術,幫助讀者理解容器化的應用與管理,進而簡化開發過程並提高效率。適合對容器技術感興趣的開發者從零開始學習與掌握。
Thumbnail
2025/04/20
本文介紹了容器的基本概念、組成部分以及其在應用開發中的重要性,特別是對初階和高階工程師的影響。透過深入探討容器的優點,以及Docker、Kubernetes和ArgoCD等相關技術,幫助讀者理解容器化的應用與管理,進而簡化開發過程並提高效率。適合對容器技術感興趣的開發者從零開始學習與掌握。
Thumbnail
2025/04/13
本文探討自動化測試的核心理念與實際應用,涵蓋如何模擬運行環境、確保程式碼在各種情境下的穩定性,以及進行錯誤處理的方法。文中指出自動化測試的各種優點,並提到設計測試的注意事項。透過使用相關工具和方法,讀者可以有效進行功能測試,並掌握相關技巧以應對常見問題,讓開發過程更為順利。
Thumbnail
2025/04/13
本文探討自動化測試的核心理念與實際應用,涵蓋如何模擬運行環境、確保程式碼在各種情境下的穩定性,以及進行錯誤處理的方法。文中指出自動化測試的各種優點,並提到設計測試的注意事項。透過使用相關工具和方法,讀者可以有效進行功能測試,並掌握相關技巧以應對常見問題,讓開發過程更為順利。
Thumbnail
看更多
你可能也想看
Thumbnail
孩子寫功課時瞇眼?小心近視!這款喜光全光譜TIONE⁺光健康智慧檯燈,獲眼科院長推薦,網路好評不斷!全光譜LED、180cm大照明範圍、5段亮度及色溫調整、350度萬向旋轉,讓孩子學習更舒適、保護眼睛!
Thumbnail
孩子寫功課時瞇眼?小心近視!這款喜光全光譜TIONE⁺光健康智慧檯燈,獲眼科院長推薦,網路好評不斷!全光譜LED、180cm大照明範圍、5段亮度及色溫調整、350度萬向旋轉,讓孩子學習更舒適、保護眼睛!
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
本文專注於策略模式,旨在通過將函數封裝為策略來簡化程式碼的維護與測試。隨著專案規模的擴大,重構的重要性顯著提高,而策略模式能有效減少程式碼中的條件語句,提升可讀性與易測性。透過範例介紹策略模式在加減乘除計算中的應用,並討論其優點與實作注意事項,幫助工程師更有效地應用此模式以應對程式碼維護挑戰。
Thumbnail
本文專注於策略模式,旨在通過將函數封裝為策略來簡化程式碼的維護與測試。隨著專案規模的擴大,重構的重要性顯著提高,而策略模式能有效減少程式碼中的條件語句,提升可讀性與易測性。透過範例介紹策略模式在加減乘除計算中的應用,並討論其優點與實作注意事項,幫助工程師更有效地應用此模式以應對程式碼維護挑戰。
Thumbnail
(這篇不是教你如何寫程式,也不是教你怎麼使用Chatgpt) 你有沒有想過,一樣是8小時,為什麼同事總可以處理很多事情?而你每天都要加班,結果還總是不盡人意呢?過去你可能會合理化說,是因為自己經驗不足、工作方法有待加強,或是時間管理不佳。依據我自己的觀察,高效與無效跟思維能力有關。
Thumbnail
(這篇不是教你如何寫程式,也不是教你怎麼使用Chatgpt) 你有沒有想過,一樣是8小時,為什麼同事總可以處理很多事情?而你每天都要加班,結果還總是不盡人意呢?過去你可能會合理化說,是因為自己經驗不足、工作方法有待加強,或是時間管理不佳。依據我自己的觀察,高效與無效跟思維能力有關。
Thumbnail
數據 在處理數據時,遵循「數據心法,少,但是做的更好」的原則可以幫助你更有效地管理和分析數據。以下是一些實踐這一原則的方法: 1. 精選數據:不要追求大量數據,而是選擇最關鍵和具有價值的數據。這可以幫助你節省時間和資源,並更好地理解你所處的情況。 2. 清理數據:確保你的數據是準確、完
Thumbnail
數據 在處理數據時,遵循「數據心法,少,但是做的更好」的原則可以幫助你更有效地管理和分析數據。以下是一些實踐這一原則的方法: 1. 精選數據:不要追求大量數據,而是選擇最關鍵和具有價值的數據。這可以幫助你節省時間和資源,並更好地理解你所處的情況。 2. 清理數據:確保你的數據是準確、完
Thumbnail
在製作策略報告時,常會需要設計出指引式方法論(metholodlogy),大家可能會有種疑問,到底甚麼是方法論呢? 簡單來說方法論是「為了達到某產出的一套做事情的邏輯,讓其他人就有了可以依循的規矩和流程,降低事情的難度」。 我以過去遇到的題目來做個舉例「在數位轉型的過程中,企業欲導入RPA機器人流程
Thumbnail
在製作策略報告時,常會需要設計出指引式方法論(metholodlogy),大家可能會有種疑問,到底甚麼是方法論呢? 簡單來說方法論是「為了達到某產出的一套做事情的邏輯,讓其他人就有了可以依循的規矩和流程,降低事情的難度」。 我以過去遇到的題目來做個舉例「在數位轉型的過程中,企業欲導入RPA機器人流程
Thumbnail
這本書是在 Agile Tour 2015 聽完作者本人演講後買的,不過,還真的沒挪出什麼時間把它看完,直到最近因為一些因素終於有時間把它看完了,所以上述很多摘錄都是心有戚戚焉。看是看完了,也別因為我上面都把好處寫出來就覺得看板方法好棒棒,一定也可以適用在你的團隊,真的嗎?
Thumbnail
這本書是在 Agile Tour 2015 聽完作者本人演講後買的,不過,還真的沒挪出什麼時間把它看完,直到最近因為一些因素終於有時間把它看完了,所以上述很多摘錄都是心有戚戚焉。看是看完了,也別因為我上面都把好處寫出來就覺得看板方法好棒棒,一定也可以適用在你的團隊,真的嗎?
Thumbnail
前陣子引起新創圈熱烈討論的是,某家公司驚人地運用ChatGPT,成功優化人資的計薪流程,並簡化人資編制3人。這是現實中的創新案例。而你知道嗎?你也可以成為工作中的「流程殺手」,優化人資流程,提高效率,不需要依賴程式碼或AI。只需要一個簡單的方法。
Thumbnail
前陣子引起新創圈熱烈討論的是,某家公司驚人地運用ChatGPT,成功優化人資的計薪流程,並簡化人資編制3人。這是現實中的創新案例。而你知道嗎?你也可以成為工作中的「流程殺手」,優化人資流程,提高效率,不需要依賴程式碼或AI。只需要一個簡單的方法。
Thumbnail
隨著企業營運規模不斷擴大、業務交流逐日成長,既有的組織、系統、甚至所有作業流程都有可能變得更繁雜,而內部的資訊以及跨部門溝通若沒有善加規劃與管理,資訊不對稱的情況將周而復始,企業的管理與營運成本也會不斷增加。
Thumbnail
隨著企業營運規模不斷擴大、業務交流逐日成長,既有的組織、系統、甚至所有作業流程都有可能變得更繁雜,而內部的資訊以及跨部門溝通若沒有善加規劃與管理,資訊不對稱的情況將周而復始,企業的管理與營運成本也會不斷增加。
Thumbnail
你是知識工作者還是產線工作者?真心建議HR真的要學習運算思維,就算對於數位科技與數據分析沒有興趣,也要掌握運算思維的解構化、抽象化、流程化、模式化核心,這對你的解決員工問題能力以及設計出有用的制度相當有幫助。反覆做是電腦的工作,不是知識工作者的工作。
Thumbnail
你是知識工作者還是產線工作者?真心建議HR真的要學習運算思維,就算對於數位科技與數據分析沒有興趣,也要掌握運算思維的解構化、抽象化、流程化、模式化核心,這對你的解決員工問題能力以及設計出有用的制度相當有幫助。反覆做是電腦的工作,不是知識工作者的工作。
Thumbnail
許多的工作流程是從過去堆疊至今的習慣。也可以這麼說...有些工作職掌的作業流程,是可以減去不必要做的。更甚至有些在作業執行時,一併產生的單據,不但沒有管控效果,其目的對於當事者來說,並未有著明確的意思...
Thumbnail
許多的工作流程是從過去堆疊至今的習慣。也可以這麼說...有些工作職掌的作業流程,是可以減去不必要做的。更甚至有些在作業執行時,一併產生的單據,不但沒有管控效果,其目的對於當事者來說,並未有著明確的意思...
Thumbnail
所有的軟體開發專案,都會有這麼一個天字第一號大挑戰:控制時程。在M社的研發手法,就是透過工程管理決定什麼要做、什麼不做,來控制開發的總時間,並利用功能規劃的手法決定開發內容。
Thumbnail
所有的軟體開發專案,都會有這麼一個天字第一號大挑戰:控制時程。在M社的研發手法,就是透過工程管理決定什麼要做、什麼不做,來控制開發的總時間,並利用功能規劃的手法決定開發內容。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News