前言
目前正在出一个设计模式专题系列教程, 篇幅会较多, 喜欢的话,给个关注❤️ ~
本节给大家讲一下设计模式中的策略模式,并结合实际业务场景给大家讲解如何使用~
本专题的所有案例代码主要以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 专题学习
- 一起来学kafka之Kafka集群搭建
- 一起来学kafka之整合SpringBoot基本使用
- 一起来学kafka之整合SpringBoot深入使用(一)
- 一起来学kafka之整合SpringBoot深入使用(二)
- 一起来学kafka之整合SpringBoot深入使用(三)
项目源码(源码已更新 欢迎star⭐️)
ElasticSearch 专题学习
项目源码(源码已更新 欢迎star⭐️)
往期并发编程内容推荐
- Java多线程专题之线程与进程概述
- Java多线程专题之线程类和接口入门
- Java多线程专题之进阶学习Thread(含源码分析)
- Java多线程专题之Callable、Future与FutureTask(含源码分析)
- 面试官: 有了解过线程组和线程优先级吗
- 面试官: 说一下线程的生命周期过程
- 面试官: 说一下线程间的通信
- 面试官: 说一下Java的共享内存模型
- 面试官: 有了解过指令重排吗,什么是happens-before
- 面试官: 有了解过volatile关键字吗 说说看
- 面试官: 有了解过Synchronized吗 说说看
- Java多线程专题之Lock锁的使用
- 面试官: 有了解过ReentrantLock的底层实现吗?说说看
- 面试官: 有了解过CAS和原子操作吗?说说看
- Java多线程专题之线程池的基本使用
- 面试官: 有了解过线程池的工作原理吗?说说看
- 面试官: 线程池是如何做到线程复用的?有了解过吗,说说看
- 面试官: 阻塞队列有了解过吗?说说看
- 面试官: 阻塞队列的底层实现有了解过吗? 说说看
- 面试官: 同步容器和并发容器有用过吗? 说说看
- 面试官: CopyOnWrite容器有了解过吗? 说说看
- 面试官: Semaphore在项目中有使用过吗?说说看(源码剖析)
- 面试官: Exchanger在项目中有使用过吗?说说看(源码剖析)
- 面试官: CountDownLatch有了解过吗?说说看(源码剖析)
- 面试官: CyclicBarrier有了解过吗?说说看(源码剖析)
- 面试官: Phaser有了解过吗?说说看
- 面试官: Fork/Join 有了解过吗?说说看(含源码分析)
- 面试官: Stream并行流有了解过吗?说说看