The Strategy Pattern 策略模式

本文介绍了策略模式的概念及其在软件设计中的应用。策略模式定义了一系列可互换的算法,并封装这些算法以便于更换,使得算法可以独立于使用它们的客户端而变化。文章强调了找出变化点并将其独立的重要性,同时提倡针对接口编程而非实现编程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

策略模式定义了算法族,分别封装起来,让它们之间可以相互替换,此设计模式让算法的变化独立于使用算法的客户。
The Strategy Pattern defines a family of algorithms,encapsulates each one, and makes them interchangeable.
Strategy lets the algorithm vary independently from clients that use it.

设计原则一:找出应用中可能需要变换之处,把它独立出来,不要和那些不需要变换的代码混在一起。
           把会变化的部分取出并封装起来,以便以后可以轻松的改动或补充此部分,而不影响不需要变化的其他部分。

设计原则二:针对接口编程,而不是针对实现编程。

设计原则三:多用组合,少用继承。
           使用组合建立系统具有很大的弹性,不仅可以将算法族封装成类,更可以“在运行时动态的改变行为”,只要组合的行为对象符合正确的标准接口即可。
 
### Java 中策略模式的实现与示例 #### 什么是策略模式策略模式是一种行为型设计模式,它允许定义一系列算法并将它们封装到独立的类中,使它们可以互换。这种模式让算法的变化独立于使用它的客户端[^1]。 #### 策略模式的核心组件 - **Context**: 定义了一个接口来接受某个 Strategy 对象,并通过该对象调用其方法。 - **Strategy**: 声明了所有具体策略都必须实现的方法。 - **Concrete Strategies**: 提供具体的算法实现。 以下是基于上述描述的一个完整的 Java 示例: ```java // Step 1: Define the strategy interface interface PaymentStrategy { void pay(int amount); } // Step 2: Implement concrete strategies class CreditCardPayment implements PaymentStrategy { private String cardNumber; public CreditCardPayment(String cardNumber) { this.cardNumber = cardNumber; } @Override public void pay(int amount) { System.out.println("Paid " + amount + " using credit card ending with " + cardNumber.substring(cardNumber.length() - 4)); } } class PayPalPayment implements PaymentStrategy { private String email; public PayPalPayment(String email) { this.email = email; } @Override public void pay(int amount) { System.out.println("Paid " + amount + " using PayPal account " + email); } } // Step 3: Create a context class that uses a strategy class ShoppingCart { private PaymentStrategy paymentStrategy; public void setPaymentStrategy(PaymentStrategy paymentStrategy) { this.paymentStrategy = paymentStrategy; } public void checkout(int amount) { if (paymentStrategy == null) { throw new IllegalStateException("Payment strategy is not set."); } else { paymentStrategy.pay(amount); } } } // Step 4: Client code to demonstrate usage of the pattern public class StrategyPatternDemo { public static void main(String[] args) { ShoppingCart cart = new ShoppingCart(); // Set and use a credit card payment method cart.setPaymentStrategy(new CreditCardPayment("1234567890123456")); cart.checkout(100); // Change to PayPal payment method dynamically cart.setPaymentStrategy(new PayPalPayment("user@example.com")); cart.checkout(200); } } ``` 在这个例子中: - `PaymentStrategy` 是一个接口,表示支付方式的行为抽象。 - `CreditCardPayment` 和 `PayPalPayment` 是两个实现了不同支付逻辑的具体策略。 - `ShoppingCart` 类作为上下文(Context),持有当前使用的支付策略并执行相应的操作。 此代码展示了如何动态切换不同的支付策略而无需修改原有业务逻辑。 #### 关键点总结 - 策略模式使得算法可以在运行时灵活替换而不影响其他部分的功能。 - 上下文(Context)负责维护对特定策略实例的引用并通过统一接口与其交互。 - 各种具体策略彼此隔离,便于扩展新的功能模块。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值