2024-10-17
一言
我为自己而死,并且,在最后的最后,为自己而活。 --- 《SCP基金会》 · abc2237512422
策略模式
策略模式简介
策略模式(Strategy Pattern)是一种行为型设计模式,定义 了一系列算法或行为,把它们分别封装起来,使得它们可以相互替换。策略模式让算法或行为在不影响客户端的情况下发生变化,主要用于从一组算法中选择一个适合的算法。
在策略模式中,有三种主要角色:
- 策略接口(Strategy Interface):定义了一系列可供选择的算法或行为。不同的算法需要实现这个接口。
- 具体策略类(Concrete Strategy):实现策略接口的不同版本,每个类代表一个独立的算法或行为。
- 上下文类(Context):它维护一个对策略对象的引用,并根据客户端的需求调用不同的策略。
策略模式的结构
策略模式的 UML 类图如下:
+-------------------+ +----------------------+
| Context | | Strategy |
|-------------------|<--------|----------------------|
| - strategy: S | | + algorithmInterface()|
| + executeStrategy()| +----------------------+
+-------------------+ ^
/ \
/ \
/ \
+-------------------+ +-------------------+
|ConcreteStrategyA | |ConcreteStrategyB |
|-------------------| |-------------------|
|+ algorithmInterface()| |+ algorithmInterface()|
+-------------------+ +-------------------+
各个组成部分:
- Context(上下文类):上下文持有策略接口的引用,可以动态地设置或更改策略对象。上下文不关注具体的算法实现,而是委托给策略对象执行。
- Strategy(策略接口):定义了所有策略必须实现的接口。策略接口通常定义一个通用的行为方法(如
algorithmInterface()
),具体的实现由各个策略类提供。 - ConcreteStrategy(具体策略):每个具体的策略类都实现了策略接口中的方法,封装了具体的算法。
策略模式的示例
下面以一个支付系统为例,用户可以选择不同的支付方式(比如信用卡、PayPal、比特币),这些支付方式就是策略,用户可以根据不同情况选择对应的策略。
1. 策略接口
首先定义一个 PaymentStrategy
接口,代表不同的支付方式策略:
public interface PaymentStrategy {
void pay(int amount);
}