Skip to content

设计模式:策略模式

ZhangPan edited this page Jul 16, 2025 · 2 revisions

策略模式(Strategy Pattern)是行为设计模式的一种,它定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式让算法独立于使用它的客户端而变化,也称为政策模式(Policy)

策略模式主要包含三个角色:

  • ​策略接口(Strategy)​​:定义所有支持的算法的公共接口,可以是接口或抽象类 ​- 具体策略类(Concrete Strategies)​​:实现策略接口的具体算法类
  • ​上下文类(Context)​​:持有一个策略对象的引用,并提供一个接口让客户端设置或切换策略

策略模式的优点:

​- 算法可以自由切换​:可以在不影响客户端的情况下更改算法

  • ​避免多重条件判断​:使用策略模式可以避免过多的if-else或switch-case语句 ​- 扩展性好​:增加新的策略时只需添加新的策略类即可,不需要修改现有代码
  • ​符合开闭原则​:对扩展开放,对修改关闭
  • ​分离关注点​:将算法的具体实现从调用者中分离出来,降低了耦合度

示例1:支付策略示例

// 支付策略接口
public interface PaymentStrategy {
    void pay(int amount);
}

// 信用卡支付策略
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(int amount) {
        System.out.println(amount + " paid with credit/debit card");
    }
}

// PayPal支付策略
public class PayPalPayment implements PaymentStrategy {
    private String email;

    public PayPalPayment(String email) {
        this.email = email;
    }

    @Override
    public void pay(int amount) {
        System.out.println(amount + " paid using PayPal.");
    }
}

// 购物车上下文
public class ShoppingCart {
    private PaymentStrategy paymentStrategy;

    public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
        this.paymentStrategy = paymentStrategy;
    }

    public void checkout(int amount) {
        if (paymentStrategy == null) {
            throw new IllegalStateException("PaymentStrategy not set");
        } else {
            paymentStrategy.pay(amount);
        }
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        ShoppingCart cart = new ShoppingCart();
        
        // 使用信用卡支付
        cart.setPaymentStrategy(new CreditCardPayment("1234-5678-9012-3456", "John Doe"));
        cart.checkout(100);
        
        // 使用PayPal支付
        cart.setPaymentStrategy(new PayPalPayment("john.doe@example.com"));
        cart.checkout(50);
    }
}

这个示例展示了在电商系统中使用策略模式实现不同支付方式的场景 。PaymentStrategy是策略接口,CreditCardPayment和PayPalPayment是具体策略类,ShoppingCart是上下文类。

示例2:结合工厂模式

策略模式可以与工厂模式结合,使用工厂来创建策略对象,从而进一步解耦客户端代码与具体策略类

public class StrategyFactory {
    public static Strategy createStrategy(String type) {
        switch (type) {
            case "A": return new ConcreteStrategyA();
            case "B": return new ConcreteStrategyB();
            default: throw new IllegalArgumentException("Unknown strategy type");
        }
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Strategy strategy = StrategyFactory.createStrategy("A");
        Context context = new Context(strategy);
        context.executeStrategy();
    }
}

公众号:玩转安卓Dev

Java基础

面向对象与Java基础知识

Java集合框架

JVM

多线程与并发

设计模式

Kotlin

Android

项目相关问题

Android基础知识

Android消息机制

Android Binder

View事件分发机制

Android屏幕刷新机制

View的绘制流程

Activity启动

Framework

性能优化

Jetpack&系统View

第三方框架实现原理

计算机网络

算法

Clone this wiki locally