策略模式
简介
定义一系列算法,把它们一个个封装起来,并且使它们可以相互替换。
使用场景:
支付方式选择
排序算法选择
压缩算法选择
游戏角色技能
实现要点:
策略接口定义算法
具体策略实现不同算法
上下文持有策略引用
UML
代码示例
支付策略接口
public interface PaymentStrategy {
/**
* 执行支付
* @param amount 支付金额
*/
void pay(double amount);
}具体策略
public class AliPayPayment implements PaymentStrategy {
private String account;
public AliPayPayment(String account) {
this.account = account;
}
@Override
public void pay(double amount) {
System.out.println("使用支付宝支付: " + amount + " 元");
System.out.println("账户: " + account);
System.out.println("支付成功!");
}
}
public class CreditCardPayment implements PaymentStrategy {
private String cardNumber;
private String name;
public CreditCardPayment(String cardNumber, String name) {
this.cardNumber = cardNumber;
this.name = name;
}
@Override
public void pay(double amount) {
System.out.println("使用信用卡支付: " + amount + " 元");
System.out.println("卡号: " + maskCardNumber(cardNumber));
System.out.println("持卡人: " + name);
System.out.println("支付成功!");
}
private String maskCardNumber(String cardNumber) {
// 隐藏部分卡号
if (cardNumber == null || cardNumber.length() < 4) {
return cardNumber;
}
return "****-****-****-" + cardNumber.substring(cardNumber.length() - 4);
}
}
public class PayPalPayment implements PaymentStrategy {
private String email;
public PayPalPayment(String email) {
this.email = email;
}
@Override
public void pay(double amount) {
System.out.println("使用PayPal支付: " + amount + " 元");
System.out.println("邮箱: " + email);
System.out.println("支付成功!");
}
}
public class WeChatPayment implements PaymentStrategy {
private String openId;
public WeChatPayment(String openId) {
this.openId = openId;
}
@Override
public void pay(double amount) {
System.out.println("使用微信支付: " + amount + " 元");
System.out.println("OpenID: " + openId);
System.out.println("支付成功!");
}
}策略模式上下文
public class ShoppingCart {
private PaymentStrategy paymentStrategy;
private double totalAmount = 0.0;
/**
* 设置支付策略
* @param paymentStrategy 支付策略
*/
public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
this.paymentStrategy = paymentStrategy;
}
/**
* 添加商品
* @param itemName 商品名称
* @param price 价格
*/
public void addItem(String itemName, double price) {
totalAmount += price;
System.out.println("添加商品: " + itemName + ", 价格: " + price + " 元");
}
/**
* 执行支付
* 委托给当前设置的支付策略
*/
public void checkout() {
if (paymentStrategy == null) {
System.out.println("错误: 未设置支付方式!");
return;
}
System.out.println("\n=== 结账 ===");
System.out.println("总金额: " + totalAmount + " 元");
paymentStrategy.pay(totalAmount);
System.out.println("================\n");
}
/**
* 获取总金额
*/
public double getTotalAmount() {
return totalAmount;
}
}
使用方式
public class StrategyPatternTest {
public static void main(String[] args) {
// 创建购物车
ShoppingCart cart = new ShoppingCart();
// 添加商品
cart.addItem("笔记本电脑", 5999.0);
cart.addItem("无线鼠标", 99.0);
cart.addItem("机械键盘", 399.0);
System.out.println("购物车总金额: " + cart.getTotalAmount() + " 元\n");
// ==========================================
// 策略1: 使用信用卡支付
// ==========================================
System.out.println("【策略1】信用卡支付");
PaymentStrategy creditCardStrategy = new CreditCardPayment("1234567890123456", "张三");
cart.setPaymentStrategy(creditCardStrategy);
cart.checkout();
// ==========================================
// 策略2: 使用支付宝支付
// ==========================================
System.out.println("【策略2】支付宝支付");
PaymentStrategy aliPayStrategy = new AliPayPayment("138****8888");
cart.setPaymentStrategy(aliPayStrategy);
cart.checkout();
// ==========================================
// 策略3: 使用微信支付
// ==========================================
System.out.println("【策略3】微信支付");
PaymentStrategy weChatStrategy = new WeChatPayment("wx_id_123456");
cart.setPaymentStrategy(weChatStrategy);
cart.checkout();
// ==========================================
// 策略模式优势演示:
// 1. 开闭原则:可以轻松添加新的支付方式(如PayPal),无需修改现有代码
// 2. 运行时切换:可以在运行时动态改变策略
// 3. 消除条件语句:不需要用 if-else 来选择不同的支付方式
// ==========================================
}
}Last updated
Was this helpful?