津津乐道设计模式 - 策略模式详解(以女友购物策略让你彻底明白)

在这里插入图片描述

古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
个人CSND主页——Micro麦可乐的博客
《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战
《RabbitMQ》本专栏主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战
《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解
如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~

津津乐道设计模式 - 策略模式详解

  • 什么是策略模式
  • 策略模式适用场景
  • 生活案例
  • 案例代码1
  • 案例代码2
  • 结语

什么是策略模式

策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列的算法,将每个算法封装起来,并使它们可以相互替换,以便根据不同的情况选择不同的算法进行执行。

策略模式适用场景

  • 算法的选择性:当程序需要根据不同的情况选择不同的算法或策略时,策略模式可以很好地应用。它允许在运行时动态地切换算法,使得系统更具灵活性和可扩展性。

  • 多个类似行为的存在:如果一个类拥有多个类似的行为,但每个行为在实现上有所不同,那么可以使用策略模式来将这些行为封装在独立的策略类中,并使它们可以互相替换。这样可以避免使用大量的条件语句或分支逻辑,使代码更加清晰和可维护。

  • 避免暴露复杂的条件逻辑:当存在大量复杂的条件逻辑时,使用策略模式可以将这些逻辑封装在具体的策略类中,使得主体逻辑更加简洁,易于理解和维护。

  • 需要在运行时动态地选择算法或策略:策略模式允许在运行时根据需要动态地选择不同的算法或策略。这对于需要根据用户输入、环境变量或其他动态因素来选择合适的算法或策略的情况非常有用。

  • 希望避免使用继承的情况:策略模式可以代替继承来实现不同行为的变化。通过使用组合而不是继承,可以更灵活地组织和管理代码。

策略模式在许多领域都有应用,包括软件开发、游戏开发、金融领域、人工智能等。它可以帮助提高代码的可维护性、灵活性和可扩展性,同时降低代码的耦合度。

生活案例

在生活场景中,我们可以通过以下例子来说明策略模式:

每每到了618、双11,你的女朋友经常会在不同的电商平台上购物。她喜欢寻找最佳的优惠策略来节省花费,因此她会根据不同的购物情况采用不同的优惠策略;

现在她要开始败家了,她上了某宝,某宝活动综合提供了20%的整体折扣优惠,并适用于所有的商品。同时发现护肤专区满减优惠满1000减250,这个时候她的CPU飞速计算:

  • 这个包包比平时省20%
  • 买护肤品满1000就可以减250 ,变相省了25%

于是在她一通操作下,将自己想要的加入到了购物车,并毫不犹豫找到你买单结算 ;

案例代码1

上面女朋友购物案例中,我们使用JAVA代码来给大家演示一下

//定义策略接口
public interface DiscountStrategy {
    double applyDiscount(double price);
}

创建打折优惠策略

/**
 * 打折优惠策略
 */
public class Discount implements DiscountStrategy{
    private double discountPercentage;

    public Discount(double discountPercentage) {
        this.discountPercentage = discountPercentage;
    }
    @Override
    public double applyDiscount(double price) {
        return price * (1 - discountPercentage);
    }
}

创建满减优惠策略

/**
 * 满减优惠策略
 */
public class FullReduction implements DiscountStrategy{

    //定义满减临界值
    private double threshold;
    //定义满减金额
    private double reductionAmount;

    public FullReduction(double threshold, double reductionAmount) {
        this.threshold = threshold;
        this.reductionAmount = reductionAmount;
    }

    @Override
    public double applyDiscount(double price) {
        if (price >= threshold) {
            return price - reductionAmount;
        } else {
            return price;
        }
    }
}

定义女友类

/**
 * 定义女友 购物策略结算
 */
public class Girlfriend {
    private DiscountStrategy discountStrategy;

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

    public double checkout(double totalPrice) {
        System.out.println("女友CPU飞速运转");
        return discountStrategy.applyDiscount(totalPrice);
    }
}

最后测试类

public class StrategyPatternTest {
    public static void main(String[] args) {

        Girlfriend cart = new Girlfriend();
        // 使用打折优惠策略
        DiscountStrategy discountStrategy = new Discount(0.2);
        cart.setDiscountStrategy(discountStrategy);
        double totalPrice = 100.0;
        double finalPrice = cart.checkout(totalPrice);
        System.out.println("使用打折优惠后的价格:" + finalPrice);

        // 使用满减优惠策略
        DiscountStrategy fullReductionStrategy = new FullReduction(200.0, 50.0);
        cart.setDiscountStrategy(fullReductionStrategy);
        totalPrice = 250.0;
        finalPrice = cart.checkout(totalPrice);
        System.out.println("使用满减优惠后的价格:" + finalPrice);
    }
}

最后输出如下:
津津乐道设计模式 - 策略模式详解(以女友购物策略让你彻底明白)_第1张图片
这个现实生活场景中的购物案例展示了策略模式的应用。通过选择不同的购物策略,你能够根据不同商城的促销优惠来获取最佳的价格。策略模式使得购物策略的变化独立于你的购物行为,为你提供了灵活性和选择性。

案例代码2

在一个电商平台上,用户可以选择不同的支付方式来完成订单支付,比如信用卡支付、支付宝支付、微信支付等。每种支付方式都有自己的特点和实现方式。

在这种情况下,策略模式可以被应用于支付场景中。让我们看看如何使用策略模式来实现支付功能:
首先,我们定义一个支付策略接口,例如 PaymentStrategy

public interface PaymentStrategy {
    void pay(double amount);
}

然后,我们创建不同的支付策略类来实现具体的支付方式,比如 信用卡支付 CreditCardPaymentStrategy支付宝支付 AlipayPaymentStrategy微信支付 WeChatPaymentStrategy 等。

//信用卡支付策略
public class CreditCardPaymentStrategy implements PaymentStrategy {
    @Override
    public void pay(double amount) {
        // 实现信用卡支付逻辑
        System.out.println("使用信用卡支付:" + amount + " 元");
    }
}

//支付宝支付策略
public class AlipayPaymentStrategy implements PaymentStrategy {
    @Override
    public void pay(double amount) {
        // 实现支付宝支付逻辑
        System.out.println("使用支付宝支付:" + amount + " 元");
    }
}

//微信支付策略
public class WeChatPaymentStrategy implements PaymentStrategy {
    @Override
    public void pay(double amount) {
        // 实现微信支付逻辑
        System.out.println("使用微信支付:" + amount + " 元");
    }
}

接下来,我们创建一个订单类 Order,它具有支付功能,通过设置不同的支付策略来完成支付。

public class Order {
    private PaymentStrategy paymentStrategy;

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

    public void processPayment(double amount) {
        // 调用支付策略的支付方法
        paymentStrategy.pay(amount);
    }
}

最后,我们可以在客户端代码中使用策略模式来完成订单支付:

public class PaymentApp {
    public static void main(String[] args) {
        Order order = new Order();

        // 使用信用卡支付
        PaymentStrategy creditCardPayment = new CreditCardPaymentStrategy();
        order.setPaymentStrategy(creditCardPayment);
        order.processPayment(100.0);

        // 使用支付宝支付
        PaymentStrategy alipayPayment = new AlipayPaymentStrategy();
        order.setPaymentStrategy(alipayPayment);
        order.processPayment(200.0);

        // 使用微信支付
        PaymentStrategy weChatPayment = new WeChatPaymentStrategy();
        order.setPaymentStrategy(weChatPayment);
        order.processPayment(300.0);
    }
}

在上述代码中,我们创建了一个订单对象 order,然后根据用户选择的支付方式设置相应的支付策略,最后调用 processPayment 方法来完成支付。

通过策略模式,用户可以根据自己的需求选择不同的支付方式,而不需要修改订单类的代码。这样可以使系统更加灵活,易于扩展和维护。

这个支付场景的例子展示了策略模式在实际应用中的使用,它将支付方式的选择和具体的支付逻辑解耦,提供了一种灵活的设计方案。

结语

本章主要带大家认识什么是策略模式,策略模式适用场景有哪些,并通过两个现实生活的场景给大家演示策略模式的使用,策略模式也是我们平时开发经常会用的模式之一,希望大家能熟练掌握~ 如果本篇文章对你有用,欢迎关注收藏评论!

样例代码:https://github.com/lhmyy521125/toher-designmode

你可能感兴趣的:(设计模式,策略模式,设计模式,java,intellij-idea)