模式概述
策略模式是一种行为型设计模式,它通过定义一系列可互换的算法,并将每个算法封装成独立类,使客户端能够根据需要动态切换算法
简单代码示例
// 1. 抽象策略接口
interface PaymentStrategy {
void pay(int amount);
}
// 2. 具体策略实现
class CreditCardPayment implements PaymentStrategy {
@Override
public void pay(int amount) {
System.out.println("信用卡支付: " + amount + "元");
}
}
class AlipayPayment implements PaymentStrategy {
@Override
public void pay(int amount) {
System.out.println("支付宝支付: " + amount + "元");
}
}
// 3. 环境类(持有策略引用)
class PaymentContext {
private PaymentStrategy strategy;
public void setStrategy(PaymentStrategy strategy) {
this.strategy = strategy;
}
public void executePayment(int amount) {
strategy.pay(amount);
}
}
// 客户端调用
public class Client {
public static void main(String[] args) {
PaymentContext context = new PaymentContext();
// 动态切换策略
context.setStrategy(new CreditCardPayment());
context.executePayment(100); // 输出:信用卡支付: 100元
context.setStrategy(new AlipayPayment());
context.executePayment(200); // 输出:支付宝支付: 200元
}
}
技术细节
1.模式组成
组件 | 职责说明 |
---|---|
抽象策略类 | 定义算法的公共接口,声明策略方法 |
具体策略类 | 实现抽象策略接口,提供具体算法实现 |
环境类 | 持有策略对象的引用,通过委托调用具体算法 |
2.优缺点
优点:
- 符合开闭原则,新增策略无需修改已有代码
- 避免多重条件判断(如if-else分支)
- 算法复用,相同策略可被不同上下文使用
缺点:
- 会产生大量小对象,增加系统复杂性
- 多层装饰时调试困难
模式应用
事务管理(PlatformTransactionManager)
策略接口:
- PlatformTransactionManager
具体策略:
DataSourceTransactionManager(JDBC事务)
JpaTransactionManager(JPA事务)
JtaTransactionManager(分布式事务)