策略模式(Strategy Pattern)是一种行为型设计模式,它允许你定义一系列算法,将每个算法封装成一个独立的类,并使它们可以互相替换,使得客户端代码可以根据需要在不修改原有代码的情况下选择不同的算法来执行某个任务。策略模式将算法的选择和使用与算法的实现分离开来,提高了代码的可维护性和扩展性。
策略模式通常包括以下角色:
通过策略模式,你可以根据需要动态地选择不同的具体策略,而不需要改变上下文类的代码。这使得策略模式在需要在运行时根据不同条件选择不同算法的情况下特别有用。例如,在一个电商网站中,可以使用策略模式来实现不同的促销策略,根据不同的季节或用户类型选择不同的促销算法。
策略模式的优点包括:
总之,策略模式是一种有助于降低耦合度、提高代码可维护性的设计模式,适用于需要根据不同情况选择不同算法的场景。
策略模式适用于以下场景:
总之,策略模式在需要根据不同情况选择不同算法、需要降低条件分支复杂度、需要支持动态切换算法或需要将算法实现与上下文分离的情况下都非常有用。
以下是使用 Python 实现的策略模式的示例,模拟了一个简单的支付系统,其中不同的支付方法被视为不同的支付策略:
# 定义支付策略接口
class PaymentStrategy:
def pay(self, amount):
pass
# 具体支付策略:信用卡支付
class CreditCardPayment(PaymentStrategy):
def __init__(self, card_number, card_holder):
self.card_number = card_number
self.card_holder = card_holder
def pay(self, amount):
print(f"支付 {amount} 元,使用信用卡 {self.card_number}(持卡人:{self.card_holder})")
# 具体支付策略:支付宝支付
class AlipayPayment(PaymentStrategy):
def __init__(self, alipay_account):
self.alipay_account = alipay_account
def pay(self, amount):
print(f"支付 {amount} 元,使用支付宝(账号:{self.alipay_account})")
# 上下文类,负责管理和切换支付策略
class PaymentContext:
def __init__(self, payment_strategy):
self.payment_strategy = payment_strategy
def set_payment_strategy(self, payment_strategy):
self.payment_strategy = payment_strategy
def execute_payment(self, amount):
self.payment_strategy.pay(amount)
# 客户端代码
if __name__ == "__main__":
# 创建不同的支付策略对象
credit_card_strategy = CreditCardPayment("1234-5678-1234-5678", "John Doe")
alipay_strategy = AlipayPayment("johndoe@example.com")
# 创建上下文对象,初始使用信用卡支付
payment_context = PaymentContext(credit_card_strategy)
# 进行支付
payment_context.execute_payment(100)
# 切换支付策略为支付宝支付
payment_context.set_payment_strategy(alipay_strategy)
payment_context.execute_payment(50)
在这个示例中:
这个示例演示了策略模式在 Python 中的实现,通过它可以根据不同的情况选择不同的支付策略,而不需要改变上下文类的代码。
+------------------+
| Context |
+------------------+
| - strategy: Strategy |
+------------------+
|
|
v
+------------------+
| Strategy |
+------------------+
| + execute(): void |
+------------------+
^
|
|
+----------------------------+
| |
v v
+------------------+ +------------------+
| ConcreteStrategyA | | ConcreteStrategyB |
+------------------+ +------------------+
| + execute(): void | | + execute(): void |
+------------------+ +------------------+
通过策略模式,客户端可以在运行时选择不同的策略,而不需要改变上下文类的代码。
上述例子用Java语言实现示例如下:
// 定义支付策略接口
interface PaymentStrategy {
void pay(int amount);
}
// 具体支付策略:信用卡支付
class CreditCardPayment implements PaymentStrategy {
private String cardNumber;
private String cardHolder;
public CreditCardPayment(String cardNumber, String cardHolder) {
this.cardNumber = cardNumber;
this.cardHolder = cardHolder;
}
@Override
public void pay(int amount) {
System.out.println("支付 " + amount + " 元,使用信用卡 " + cardNumber + "(持卡人:" + cardHolder + ")");
}
}
// 具体支付策略:支付宝支付
class AlipayPayment implements PaymentStrategy {
private String alipayAccount;
public AlipayPayment(String alipayAccount) {
this.alipayAccount = alipayAccount;
}
@Override
public void pay(int amount) {
System.out.println("支付 " + amount + " 元,使用支付宝(账号:" + alipayAccount + ")");
}
}
// 上下文类,负责管理和切换支付策略
class PaymentContext {
private PaymentStrategy paymentStrategy;
public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
this.paymentStrategy = paymentStrategy;
}
public void executePayment(int amount) {
paymentStrategy.pay(amount);
}
}
// 客户端代码
public class PaymentApp {
public static void main(String[] args) {
// 创建不同的支付策略对象
PaymentStrategy creditCardStrategy = new CreditCardPayment("1234-5678-1234-5678", "John Doe");
PaymentStrategy alipayStrategy = new AlipayPayment("johndoe@example.com");
// 创建上下文对象,初始使用信用卡支付
PaymentContext paymentContext = new PaymentContext();
// 进行支付
paymentContext.setPaymentStrategy(creditCardStrategy);
paymentContext.executePayment(100);
// 切换支付策略为支付宝支付
paymentContext.setPaymentStrategy(alipayStrategy);
paymentContext.executePayment(50);
}
}
上述例子用golang实现示例如下:
package main
import "fmt"
// 定义支付策略接口
type PaymentStrategy interface {
Pay(amount int)
}
// 具体支付策略:信用卡支付
type CreditCardPayment struct {
cardNumber string
cardHolder string
}
func NewCreditCardPayment(cardNumber, cardHolder string) *CreditCardPayment {
return &CreditCardPayment{cardNumber, cardHolder}
}
func (c *CreditCardPayment) Pay(amount int) {
fmt.Printf("支付 %d 元,使用信用卡 %s(持卡人:%s)\n", amount, c.cardNumber, c.cardHolder)
}
// 具体支付策略:支付宝支付
type AlipayPayment struct {
alipayAccount string
}
func NewAlipayPayment(alipayAccount string) *AlipayPayment {
return &AlipayPayment{alipayAccount}
}
func (a *AlipayPayment) Pay(amount int) {
fmt.Printf("支付 %d 元,使用支付宝(账号:%s)\n", amount, a.alipayAccount)
}
// 上下文类,负责管理和切换支付策略
type PaymentContext struct {
paymentStrategy PaymentStrategy
}
func (pc *PaymentContext) SetPaymentStrategy(paymentStrategy PaymentStrategy) {
pc.paymentStrategy = paymentStrategy
}
func (pc *PaymentContext) ExecutePayment(amount int) {
pc.paymentStrategy.Pay(amount)
}
// 客户端代码
func main() {
// 创建不同的支付策略对象
creditCardStrategy := NewCreditCardPayment("1234-5678-1234-5678", "John Doe")
alipayStrategy := NewAlipayPayment("johndoe@example.com")
// 创建上下文对象,初始使用信用卡支付
paymentContext := PaymentContext{}
// 进行支付
paymentContext.SetPaymentStrategy(creditCardStrategy)
paymentContext.ExecutePayment(100)
// 切换支付策略为支付宝支付
paymentContext.SetPaymentStrategy(alipayStrategy)
paymentContext.ExecutePayment(50)
}
上述例子用javascript实现示例如下:
// 定义支付策略接口
class PaymentStrategy {
pay(amount) {}
}
// 具体支付策略:信用卡支付
class CreditCardPayment extends PaymentStrategy {
constructor(cardNumber, cardHolder) {
super();
this.cardNumber = cardNumber;
this.cardHolder = cardHolder;
}
pay(amount) {
console.log(`支付 ${amount} 元,使用信用卡 ${this.cardNumber}(持卡人:${this.cardHolder})`);
}
}
// 具体支付策略:支付宝支付
class AlipayPayment extends PaymentStrategy {
constructor(alipayAccount) {
super();
this.alipayAccount = alipayAccount;
}
pay(amount) {
console.log(`支付 ${amount} 元,使用支付宝(账号:${this.alipayAccount})`);
}
}
// 上下文类,负责管理和切换支付策略
class PaymentContext {
constructor() {
this.paymentStrategy = null;
}
setPaymentStrategy(paymentStrategy) {
this.paymentStrategy = paymentStrategy;
}
executePayment(amount) {
if (this.paymentStrategy) {
this.paymentStrategy.pay(amount);
} else {
console.log("请选择支付策略。");
}
}
}
// 客户端代码
const creditCardStrategy = new CreditCardPayment("1234-5678-1234-5678", "John Doe");
const alipayStrategy = new AlipayPayment("johndoe@example.com");
const paymentContext = new PaymentContext();
// 进行支付
paymentContext.setPaymentStrategy(creditCardStrategy);
paymentContext.executePayment(100);
// 切换支付策略为支付宝支付
paymentContext.setPaymentStrategy(alipayStrategy);
paymentContext.executePayment(50);
上述例子用C++实现如下:
#include
#include
// 定义支付策略接口
class PaymentStrategy {
public:
virtual void pay(int amount) = 0;
};
// 具体支付策略:信用卡支付
class CreditCardPayment : public PaymentStrategy {
private:
std::string cardNumber;
std::string cardHolder;
public:
CreditCardPayment(const std::string& cardNumber, const std::string& cardHolder)
: cardNumber(cardNumber), cardHolder(cardHolder) {}
void pay(int amount) override {
std::cout << "支付 " << amount << " 元,使用信用卡 " << cardNumber << "(持卡人:" << cardHolder << ")" << std::endl;
}
};
// 具体支付策略:支付宝支付
class AlipayPayment : public PaymentStrategy {
private:
std::string alipayAccount;
public:
AlipayPayment(const std::string& alipayAccount) : alipayAccount(alipayAccount) {}
void pay(int amount) override {
std::cout << "支付 " << amount << " 元,使用支付宝(账号:" << alipayAccount << ")" << std::endl;
}
};
// 上下文类,负责管理和切换支付策略
class PaymentContext {
private:
PaymentStrategy* paymentStrategy;
public:
PaymentContext() : paymentStrategy(nullptr) {}
void setPaymentStrategy(PaymentStrategy* strategy) {
paymentStrategy = strategy;
}
void executePayment(int amount) {
if (paymentStrategy) {
paymentStrategy->pay(amount);
} else {
std::cout << "请选择支付策略。" << std::endl;
}
}
};
int main() {
// 创建不同的支付策略对象
CreditCardPayment creditCardStrategy("1234-5678-1234-5678", "John Doe");
AlipayPayment alipayStrategy("johndoe@example.com");
// 创建上下文对象,初始使用信用卡支付
PaymentContext paymentContext;
// 进行支付
paymentContext.setPaymentStrategy(&creditCardStrategy);
paymentContext.executePayment(100);
// 切换支付策略为支付宝支付
paymentContext.setPaymentStrategy(&alipayStrategy);
paymentContext.executePayment(50);
return 0;
}
假设您正在设计一个电商系统,其中不同的促销策略可以根据购物车中的商品数量来应用。您需要使用策略模式来实现这个功能。
要求:
你可以使用 C++、Java、Python 或任何其他编程语言来实现这个练习。
你可以在评论区里或者私信我回复您的答案,这样我或者大家都能帮你解答,期待着你的回复~