軟體設計模式 | 策略模式

更新於 發佈於 閱讀時間約 3 分鐘
策略模式將多種演算法封裝於獨立的策略類別中,每個策略類別都實現了一個共同的策略執行介面。使用者在系統運行時得以動態選擇切換演算法達成相同目標。
raw-image

關鍵影響

  1. 靈活性與擴展性:可以輕鬆更換演算法,使得應用更靈活,容易增加新功能。
  2. 降低耦合簡化管理:不同的演算法彼此獨立不會互相影響,更容易管理與維護。
  3. 快速適應變化:可以快速添加新的策略以應對變化,無需大幅修改現有架構。

應用場景

假設我們正在開發購物車系統,需要支援多種支付方式,如PayPal、信用卡和銀行轉帳。使用策略模式可以讓我們輕鬆切換和擴展不同的支付策略。

組件設計:

  • 策略介面(Strategy Interface):定義了一個共通的支付介面,所有的支付策略都必須實現這個介面。
  • 具體策略(Concrete Strategies):為每種支付方式實現具體的支付策略,例如 PayPalPaymentCreditCardPaymentBankTransferPayment
  • 上下文(Context):購物車,將使用根據用戶的選擇動態切換不同的支付策略。
from abc import ABC, abstractmethod

# 策略介面 - 支付策略
class PaymentStrategy(ABC):
@abstractmethod
def pay(self, amount):
pass

# 具體策略:PayPal
class PayPalPayment(PaymentStrategy):
def pay(self, amount):
print(f"使用 PayPal 支付 {amount} 元")

# 具體策略:信用卡
class CreditCardPayment(PaymentStrategy):
def pay(self, amount):
print(f"使用信用卡支付 {amount} 元")

# 上下文 - 購物車
class ShoppingCart:
def __init__(self, payment_strategy: PaymentStrategy):
self.payment_strategy = payment_strategy

def checkout(self, amount):
self.payment_strategy.pay(amount)

# 使用
cart = ShoppingCart(PayPalPayment())
cart.checkout(100) # 輸出: 使用 PayPal 支付 100

cart.payment_strategy = CreditCardPayment()
cart.checkout(200) # 輸出: 使用信用卡支付 200

結論

透過使用策略模式,購物車系統能夠靈活地切換不同的支付方式,並且方便地添加新的支付方法。

這種設計不僅簡化了系統中各個支付策略的管理,也使得支付功能的擴展和維護更加高效和靈活。

留言
avatar-img
留言分享你的想法!
avatar-img
再寫5分鐘
66會員
19內容數
探索自我實現的小角落。沒有高高在上的教條,只有真實的分享和心得。
再寫5分鐘的其他內容
2024/07/02
在前一篇我們已經成功地建立簽核表單及簽核節點並關聯回請假表單,而本篇會接著介紹如何管理簽核節點狀態並同步更新簽核表單狀態。
Thumbnail
2024/07/02
在前一篇我們已經成功地建立簽核表單及簽核節點並關聯回請假表單,而本篇會接著介紹如何管理簽核節點狀態並同步更新簽核表單狀態。
Thumbnail
2024/07/02
本文介紹瞭如何在後端系統開發時設計不同表單的簽核流程,包括請假表單和採購表單。以及如何動態生成簽核表單,並建立簽核節點。另外還介紹瞭如何利用繼承來簡化簽核流程的設定。
Thumbnail
2024/07/02
本文介紹瞭如何在後端系統開發時設計不同表單的簽核流程,包括請假表單和採購表單。以及如何動態生成簽核表單,並建立簽核節點。另外還介紹瞭如何利用繼承來簡化簽核流程的設定。
Thumbnail
2024/06/15
《Future GPX Cyber Formula》閃電霹靂車是一部關於AI賽車的動漫作品,講述了主角與AI合作的故事。文章引述了動漫中的情節與角色,突出了AI協助駕駛者的功能。全文帶有熱血激情、深度思考和特殊概念。
Thumbnail
2024/06/15
《Future GPX Cyber Formula》閃電霹靂車是一部關於AI賽車的動漫作品,講述了主角與AI合作的故事。文章引述了動漫中的情節與角色,突出了AI協助駕駛者的功能。全文帶有熱血激情、深度思考和特殊概念。
Thumbnail
看更多
你可能也想看
Thumbnail
介紹朋友新開的蝦皮選物店『10樓2選物店』,並分享方格子與蝦皮合作的分潤計畫,註冊流程簡單,0成本、無綁約,推薦給想增加收入的讀者。
Thumbnail
介紹朋友新開的蝦皮選物店『10樓2選物店』,並分享方格子與蝦皮合作的分潤計畫,註冊流程簡單,0成本、無綁約,推薦給想增加收入的讀者。
Thumbnail
當你邊吃粽子邊看龍舟競賽直播的時候,可能會順道悼念一下2300多年前投江的屈原。但你知道端午節及其活動原先都與屈原毫無關係嗎?這是怎麼回事呢? 本文深入探討端午節設立初衷、粽子、龍舟競渡與屈原自沉四者。看完這篇文章,你就會對端午、粽子、龍舟和屈原的四角關係有新的認識喔。那就讓我們一起解開謎團吧!
Thumbnail
當你邊吃粽子邊看龍舟競賽直播的時候,可能會順道悼念一下2300多年前投江的屈原。但你知道端午節及其活動原先都與屈原毫無關係嗎?這是怎麼回事呢? 本文深入探討端午節設立初衷、粽子、龍舟競渡與屈原自沉四者。看完這篇文章,你就會對端午、粽子、龍舟和屈原的四角關係有新的認識喔。那就讓我們一起解開謎團吧!
Thumbnail
樣板模式的定義極為簡單,卻是大型系統程式、WEB/APP應用框架的設計核心,完美展現設計模式的價值: 簡單、高效、強大。
Thumbnail
樣板模式的定義極為簡單,卻是大型系統程式、WEB/APP應用框架的設計核心,完美展現設計模式的價值: 簡單、高效、強大。
Thumbnail
本書介紹了戰略設計、管理領域複雜度、實際應用領域驅動設計等主題。透過對核心子領域、支持子領域、限界上下文等概念的探討,提供了領域驅動設計的相關知識。這篇文章中還涉及了微服務、事件驅動架構和資料網格等相關主題,提供了設計系統和應用領域驅動設計的指導。
Thumbnail
本書介紹了戰略設計、管理領域複雜度、實際應用領域驅動設計等主題。透過對核心子領域、支持子領域、限界上下文等概念的探討,提供了領域驅動設計的相關知識。這篇文章中還涉及了微服務、事件驅動架構和資料網格等相關主題,提供了設計系統和應用領域驅動設計的指導。
Thumbnail
觀察者模式透過主題訂閱/訊息通知的機制,極度增強系統的可擴展性、靈活性以及降低組件間的耦合度。概念直觀簡單,是非常實用的設計模式。
Thumbnail
觀察者模式透過主題訂閱/訊息通知的機制,極度增強系統的可擴展性、靈活性以及降低組件間的耦合度。概念直觀簡單,是非常實用的設計模式。
Thumbnail
代理模式通過封裝原始對象來實現對該對象的控制和管理,同時不改變原始對象的行為或客戶端與該對象互動的方式,以此介入或增強對該對象的訪問和操作。
Thumbnail
代理模式通過封裝原始對象來實現對該對象的控制和管理,同時不改變原始對象的行為或客戶端與該對象互動的方式,以此介入或增強對該對象的訪問和操作。
Thumbnail
策略模式將多種演算法封裝於獨立的策略類別中,每個策略類別都實現了一個共同的介面。這種設計允許使用者在系統運行時動態選擇和切換演算法,以達成相同的目的。
Thumbnail
策略模式將多種演算法封裝於獨立的策略類別中,每個策略類別都實現了一個共同的介面。這種設計允許使用者在系統運行時動態選擇和切換演算法,以達成相同的目的。
Thumbnail
Creative Coding 作品變化概念,有或沒有的差別,隨機性,色彩模式的調整...等
Thumbnail
Creative Coding 作品變化概念,有或沒有的差別,隨機性,色彩模式的調整...等
Thumbnail
列出一套完整的程式 程式設計有許多種方法,不過通常會先列出清單的再逐一執行,這樣會加快程式設計的速度。設計通常會採取順推的辦法。所以順推的程式設計方式就是經歷觀念溝通、系統分析、資料統合、權限管理、頻率與時間、後台管理、畫面設計等等階段後,將框架設計完了以後,先列出一套完整的程式,將所有使用者都確
Thumbnail
列出一套完整的程式 程式設計有許多種方法,不過通常會先列出清單的再逐一執行,這樣會加快程式設計的速度。設計通常會採取順推的辦法。所以順推的程式設計方式就是經歷觀念溝通、系統分析、資料統合、權限管理、頻率與時間、後台管理、畫面設計等等階段後,將框架設計完了以後,先列出一套完整的程式,將所有使用者都確
Thumbnail
系統的分析與規劃 在談到程式設計時,首要的是進行系統的分析與規劃。程式設計的起點通常是系統分析與規劃,這涉及到如何分析和設計系統的大原則和方向。為了達到預期效果,重要的是擁有對產業的清晰邏輯認識和深入了解。 進行深入了解 若要進行系統分析,必須對企業的設計和程式設計的對象進行深入了解,以充分理
Thumbnail
系統的分析與規劃 在談到程式設計時,首要的是進行系統的分析與規劃。程式設計的起點通常是系統分析與規劃,這涉及到如何分析和設計系統的大原則和方向。為了達到預期效果,重要的是擁有對產業的清晰邏輯認識和深入了解。 進行深入了解 若要進行系統分析,必須對企業的設計和程式設計的對象進行深入了解,以充分理
Thumbnail
題目敘述 題目會給我們一組定義好的界面和需求,要求我們設計一個資料結構,可以滿足平均O(1)的插入元素、刪除元素、隨機取得元素的操作。 RandomizedSet() 類別建構子 bool insert(int val) 插入元素的function界面 bool remove(int val
Thumbnail
題目敘述 題目會給我們一組定義好的界面和需求,要求我們設計一個資料結構,可以滿足平均O(1)的插入元素、刪除元素、隨機取得元素的操作。 RandomizedSet() 類別建構子 bool insert(int val) 插入元素的function界面 bool remove(int val
Thumbnail
是否有時遇到一種情況,發現一種似乎有一定勝率的交易技術線型, 想回測時,若軟體沒有提供相關線型回測,就必須自己寫程式來呈現線型,進而回測 然而卻不知道如何用程式的方式將他呈現出來。 今天用XQ來做個簡單分享: 弄清楚運作模式 在懂得基本變數的情況下,最重要的是懂得程式是怎麼運作的, 無
Thumbnail
是否有時遇到一種情況,發現一種似乎有一定勝率的交易技術線型, 想回測時,若軟體沒有提供相關線型回測,就必須自己寫程式來呈現線型,進而回測 然而卻不知道如何用程式的方式將他呈現出來。 今天用XQ來做個簡單分享: 弄清楚運作模式 在懂得基本變數的情況下,最重要的是懂得程式是怎麼運作的, 無
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News