一起来学设计模式之策略模式

344 阅读7分钟

前言

目前正在出一个设计模式专题系列教程, 篇幅会较多, 喜欢的话,给个关注❤️ ~

本节给大家讲一下设计模式中的策略模式,并结合实际业务场景给大家讲解如何使用~

本专题的所有案例代码主要以Java语言为主, 好了, 废话不多说直接开整吧~

策略模式

策略模式是一种软件设计模式,它定义了一系列算法,将每个算法都封装起来,并且使它们可以互换。策略模式使得算法可以独立于它们的使用者而变化。

策略模式通过在Context中维护一个抽象策略类的引用,使得 Context 可以在运行时选择不同的具体策略类来实现不同的算法。

首先定义策略接口:

public interface Strategy {
    int doOperation(int num1, int num2);
}

其次,实现不同的具体策略类:

public class OperationAdd implements Strategy {
    public int doOperation(int num1, int num2) {
        return num1 + num2;
    }
}
 public class OperationSubtract implements Strategy {
    public int doOperation(int num1, int num2) {
        return num1 - num2;
    }
}
 public class OperationMultiply implements Strategy {
    public int doOperation(int num1, int num2) {
        return num1 * num2;
    }
}

最后,在 Context 中维护一个策略引用,并在运行时选择不同的具体策略类来实现不同的算法:

public class Context {
    private Strategy strategy;
     public Context(Strategy strategy) {
        this.strategy = strategy;
    }
     public int executeStrategy(int num1, int num2) {
        return strategy.doOperation(num1, num2);
    }
     public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }
}

测试:

public class Client {
    public static void main(String[] args) throws Exception {
        Context context = new Context(new OperationAdd());
        System.out.println("10 + 5 = " + context.executeStrategy(10, 5));
        context.setStrategy(new OperationSubtract());
        System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
        context.setStrategy(new OperationMultiply());
        System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
//        10 + 5 = 15
//        10 - 5 = 5
//        10 * 5 = 50
    }
}

这个例子中,我们定义了三个具体策略类:OperationAdd、OperationSubtract 和 OperationMultiply 分别实现了不同的算法。然后,在 Context 中维护了一个策略引用,使得客户端可以在运行时选择不同的具体策略类来实现不同的算法。这样,我们就将算法的实现和客户端的逻辑分离开来,使得代码更加可维护和可扩展。

最佳实践

电商平台使用策略模式可以很好地实现不同的付款方式,如支付宝、微信支付、网银支付等等。当用户选择不同的付款方式时,电商平台可以动态地选择不同的支付策略来实现不同的支付方式。

首先,定义支付策略接口:

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

其次,实现不同的具体支付策略类:

public class AlipayStrategy implements PaymentStrategy {
    @Override
    public void pay(double amount) {
        System.out.println("使用支付宝支付" + amount + "元");
    }
}
 public class WechatPayStrategy implements PaymentStrategy {
    @Override
    public void pay(double amount) {
        System.out.println("使用微信支付" + amount + "元");
    }
}
 public class BankPayStrategy implements PaymentStrategy {
     @Override
    public void pay(double amount) {
        System.out.println("使用网银支付" + amount + "元");
    }
}

最后,在电商平台中维护一个支付策略引用,并在运行时选择不同的具体支付策略来实现不同的支付方式:

public class EcommercePlatform {
    private PaymentStrategy paymentStrategy;
     public EcommercePlatform(PaymentStrategy paymentStrategy) {
        this.paymentStrategy = paymentStrategy;
    }
     public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
        this.paymentStrategy = paymentStrategy;
    }
     public void pay(double amount) {
        paymentStrategy.pay(amount);
    }
}

这样,在程序运行时,电商平台可以通过如下代码来选择不同的具体支付策略:

public class Client {
    public static void main(String[] args) {
        PaymentStrategy paymentStrategy = new AlipayStrategy();
        EcommercePlatform ecommercePlatform = new EcommercePlatform(paymentStrategy);
        ecommercePlatform.pay(100);
        paymentStrategy = new WechatPayStrategy();
        ecommercePlatform.setPaymentStrategy(paymentStrategy);
        ecommercePlatform.pay(200);
        paymentStrategy = new BankPayStrategy();
        ecommercePlatform.setPaymentStrategy(paymentStrategy);
        ecommercePlatform.pay(300);

         // 使用支付宝支付100.0元
         // 使用微信支付200.0元
         // 使用网银支付300.0元
    }
}

这个例子中,我们定义了三个具体支付策略类:AlipayStrategy、WechatPayStrategy 和 BankPayStrategy 分别实现了不同的支付方式。然后,在电商平台中维护了一个支付策略引用,使得客户端可以在运行时选择不同的具体支付策略来实现不同的支付方式。这样,我们就将支付方式的实现和客户端的逻辑分离开来,使得代码更加可维护可扩展

结束语

设计模式其实并不难,大家在学习的时候一定要在理解的基础上去写代码,不要去背代码。下节给大家讲模板方法模式~

本着把自己知道的都告诉大家,如果本文对您有所帮助,点赞+关注鼓励一下呗~

相关文章

项目源码(源码已更新 欢迎star⭐️)

Kafka 专题学习

项目源码(源码已更新 欢迎star⭐️)

ElasticSearch 专题学习

项目源码(源码已更新 欢迎star⭐️)

往期并发编程内容推荐

推荐 SpringBoot & SpringCloud (源码已更新 欢迎star⭐️)

博客(阅读体验较佳)