设计模式Java版:02策略模式(行为型)

定义

策略模式(Strategy Pattern)是一种行为型设计模式,它允许在运行时选择算法的行为。策略模式通过定义一系列算法(即策略),并将其封装在独立的类中,使得它们可以相互替换,从而使算法的变化独立于使用它们的客户端。

策略模式的主要目的是提供一种灵活的方式来定义、封装和交换算法。它将不同的算法封装在各自的类中,并使它们可以互相替换,从而使得算法可以独立于客户端而变化。

策略模式包含以下角色:

环境(Context):持有一个策略对象的引用,并在需要时调用策略对象的方法。
抽象策略(Strategy):定义了一个公共接口,用于封装具体策略类的算法。
具体策略(Concrete Strategy):实现了抽象策略定义的接口,提供具体的算法实现。
策略模式的优点包括:

算法可以独立于客户端而变化,客户端可以通过使用不同的策略对象来实现不同的行为。
策略模式将算法的定义、使用和管理进行了解耦,提高了代码的灵活性和可维护性。
策略模式符合开闭原则,易于扩展和修改。

策略模式适用于以下场景:

当一个系统需要在多个算法中选择一种合适的算法时,可以使用策略模式来避免使用多重条件语句。
当一个类的行为取决于它的状态,并且需要在运行时根据状态变化而改变行为时,可以使用策略模式来封装状态相关的行为。
当一个系统需要支持多种类似的算法,并且这些算法之间可以相互替换时,可以使用策略模式来简化算法的管理和切换。

示例一:支付策略

// 策略接口
interface PaymentStrategy {
    void pay(double amount);
}

// 具体策略类1
class CreditCardPayment implements PaymentStrategy {
    private String cardNumber;
    private String cvv;

    public CreditCardPayment(String cardNumber, String cvv) {
        this.cardNumber = cardNumber;
        this.cvv = cvv;
    }

    @Override
    public void pay(double amount) {
        // 实现信用卡支付的逻辑
        System.out.println("Paid " + amount + " using credit card " + cardNumber);
    }
}

// 具体策略类2
class PayPalPayment implements PaymentStrategy {
    private String email;
    private String password;

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

    @Override
    public void pay(double amount) {
        // 实现PayPal支付的逻辑
        System.out.println("Paid " + amount + " using PayPal account " + email);
    }
}

// 上下文类
class ShoppingCart {
    private PaymentStrategy paymentStrategy;

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

    public void checkout(double amount) {
        // 使用所选的支付策略进行支付
        paymentStrategy.pay(amount);
    }
}

// 测试代码
public class StrategyPatternExample {
    public static void main(String[] args) {
        // 创建一个购物车对象
        ShoppingCart cart = new ShoppingCart();

        // 设置信用卡支付策略
        PaymentStrategy creditCardPayment = new CreditCardPayment("123456789", "123");
        cart.setPaymentStrategy(creditCardPayment);

        // 使用信用卡支付
        cart.checkout(100.0);

        // 设置PayPal支付策略
        PaymentStrategy payPalPayment = new PayPalPayment("example@gmail.com", "password");
        cart.setPaymentStrategy(payPalPayment);

        // 使用PayPal支付
        cart.checkout(200.0);
    }
}

说明

在上面的示例中,我们定义了一个策略接口 PaymentStrategy,它有一个 pay() 方法用于执行支付操作。然后,我们实现了两个具体的策略类 CreditCardPayment 和 PayPalPayment,它们分别代表信用卡支付和PayPal支付的具体实现。最后,我们使用上下文类 ShoppingCart 来设置所选的支付策略并执行支付操作。

在测试代码中,我们首先设置了信用卡支付策略并进行支付,然后设置了PayPal支付策略并再次进行支付。

策略模式的优点是可以将算法的实现与使用它的代码分离,使得代码更加灵活和可维护。

示例二:折扣策略

// 策略接口
interface DiscountStrategy {
    double applyDiscount(double amount);
}

// 具体策略类1:普通用户折扣策略
class RegularCustomerDiscount implements DiscountStrategy {
    @Override
    public double applyDiscount(double amount) {
        return amount * 0.95; // 5% 折扣
    }
}

// 具体策略类2:VIP用户折扣策略
class VipCustomerDiscount implements DiscountStrategy {
    @Override
    public double applyDiscount(double amount) {
        return amount * 0.9; // 10% 折扣
    }
}

// 上下文类
class ShoppingCart {
    private DiscountStrategy discountStrategy;

    public void setDiscountStrategy(DiscountStrategy discountStrategy) {
        this.discountStrategy = discountStrategy;
    }

    public double calculateTotalAmount(double amount) {
        // 使用所选的折扣策略计算总金额
        return discountStrategy.applyDiscount(amount);
    }
}

// 测试代码
public class StrategyPatternExample {
    public static void main(String[] args) {
        // 创建一个购物车对象
        ShoppingCart cart = new ShoppingCart();

        // 设置普通用户折扣策略
        DiscountStrategy regularCustomerDiscount = new RegularCustomerDiscount();
        cart.setDiscountStrategy(regularCustomerDiscount);

        // 计算总金额
        double totalAmount = cart.calculateTotalAmount(100.0);
        System.out.println("Total amount for regular customer: " + totalAmount);

        // 设置VIP用户折扣策略
        DiscountStrategy vipCustomerDiscount = new VipCustomerDiscount();
        cart.setDiscountStrategy(vipCustomerDiscount);

        // 计算总金额
        totalAmount = cart.calculateTotalAmount(100.0);
        System.out.println("Total amount for VIP customer: " + totalAmount);
    }
}

说明

在上面的示例中,我们定义了一个策略接口 DiscountStrategy,它有一个 applyDiscount() 方法用于应用折扣。然后,我们实现了两个具体的策略类 RegularCustomerDiscount 和 VipCustomerDiscount,它们分别代表普通用户折扣和VIP用户折扣的具体实现。最后,我们使用上下文类 ShoppingCart 来设置所选的折扣策略并计算总金额。

在测试代码中,我们首先设置了普通用户折扣策略,并计算总金额。然后,我们设置了VIP用户折扣策略,并再次计算总金额。

策略模式的优点是可以根据不同的需求定义不同的策略,并在运行时动态地切换策略,而无需修改使用策略的代码。这样可以提高代码的可扩展性和可维护性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

道法自然 实事求是

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值