当前位置: 首页 > news >正文

java 设计模式 策略模式

简介

策略模式(Strategy Pattern)是一种行为设计模式,旨在定义一系列算法,并将每一个算法封装起来,使它们可以互相替换。策略模式让算法的变化独立于使用算法的客户端。换句话说,策略模式通过将不同的算法封装成独立的策略类,允许在运行时动态选择不同的策略,而无需修改客户端代码。

策略模式的组成部分

Context(上下文类):上下文类持有一个策略对象,并提供一个接口来让客户端设置或更改策略。上下文通常会在需要时委托策略类来执行具体的算法。

Strategy(策略接口):策略接口定义了一个共同的接口,所有具体策略类都需要实现这个接口。

ConcreteStrategy(具体策略类):具体策略类实现了策略接口,封装了具体的算法或行为。

下面解释最常用的写法

通用实现

场景

例如现在公司在做一个支付平台,需要对接很多家第三方公司,例如支付宝,拉卡拉,通联之类的

第一步定义策略类接口
可以理解为这是对支付的一个策略,因为需要根据客户端创建类型创建不同的支付策略

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

第二步创建具体策略类
例如下面就创建了银行卡支付,支付宝支付,微信支付三个策略类,继承PaymentStrategy接口

// 信用卡支付
public class CreditCardPayment implements PaymentStrategy {@Overridepublic void pay(double amount) {System.out.println("Using Credit Card to pay: " + amount);}
}// 支付宝支付
public class AlipayPayment implements PaymentStrategy {@Overridepublic void pay(double amount) {System.out.println("Using Alipay to pay: " + amount);}
}// 微信支付
public class WeChatPayment implements PaymentStrategy {@Overridepublic void pay(double amount) {System.out.println("Using WeChat Pay to pay: " + amount);}
}

第三步创建上下文类,来转发到对应的具体策略类实现,一般来说就是设置策略(向上转型),然后执行支付对应到不同的实现类

public class PaymentContext {private PaymentStrategy paymentStrategy;// 设置策略public void setPaymentStrategy(PaymentStrategy paymentStrategy) {this.paymentStrategy = paymentStrategy;}// 执行支付public void executePayment(double amount) {if (paymentStrategy == null) {System.out.println("No payment strategy set!");return;}paymentStrategy.pay(amount);}
}

第四步客户端调用,这样客户端就只需要创建对应的支付方式就行了

public class Main {public static void main(String[] args) {PaymentContext context = new PaymentContext();// 设置为信用卡支付策略context.setPaymentStrategy(new CreditCardPayment());context.executePayment(100.0);// 设置为支付宝支付策略context.setPaymentStrategy(new AlipayPayment());context.executePayment(200.0);// 设置为微信支付策略context.setPaymentStrategy(new WeChatPayment());context.executePayment(300.0);}
}

简略实现

这里我感觉策略模式实际上就是根据不同的情况,再程序运行的时候动态切换方式
那么有个场景 在登录的时候有多种登录方式,这时候下面这种方式创建的,是不是也是策略模式呢

@Component
public class LoginStrategyFactory {private final Map<Integer, LoginStrategy> strategyMap = new ConcurrentHashMap<>();public LoginStrategyFactory(Map<String, LoginStrategy> strategyMap) {strategyMap.values().forEach(strategy -> this.strategyMap.put(strategy.getLoginType().getLoginType(), strategy));}public LoginStrategy getStrategy(Integer loginType) {return strategyMap.get(loginType);}
} 

这里登录的时候根据客户端传过来的登录类型(账号密码还是短信,或者其他的)来获取不同的对象

    public TokenVO login(LoginRequest loginRequest) {LoginStrategy strategy = loginStrategyFactory.getStrategy(loginRequest.getAuthType());if (Objects.isNull(strategy)) {throw ExFactory.bizException(PaymentError.UNSUPPORTED_AUTH_TYPE);}return loginProcessor.login(loginRequest, strategy);}

相关文章:

  • docker的基础知识
  • 微服务4--服务网关
  • 【Qt】常用显示类控件概述(Label、LCD Number、ProgressBar、Calendar Widget)
  • 用手机也能打《无畏契约》?登录ToDesk即可开玩
  • Edge 浏览器推出 Copilot Vision:免费实时解析屏幕内容;Aqua Voice:极速 AI 语音输入工具丨日报
  • Matter如何终结智能家居生态割据,重构你的居住体验?
  • 最快打包WPF 应用程序
  • 教程:批量提取PDF页面指定区域位置的内容,将内容保存到Excel表格,基于WPF的实现过程和方案,可以提取电子发票等类型的PDF文档,将明细保存表格
  • 【Web前端技术】第二节—HTML标签(上)
  • 【Redis】Redis基本命令(1)
  • 【AI】——结合Ollama、Open WebUI和Docker本地部署可视化AI大语言模型
  • LeetCode每日一题4.17
  • 数据江湖:Node.js 与 SQLite3 的轻量之道
  • 昆仑万维开源 32B 推理模型 Skywork-OR1:超越 DeepSeek-R1
  • 测试用例的生命周期:从诞生到退役的全过程管理
  • 华为OD机试真题——统计匹配的二元组个数(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
  • 华为OD机试真题——最小的调整次数/特异性双端队列(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
  • java抽象类
  • GIS开发笔记(4)结合osg及osgEarth实现地图选点功能
  • Java并发-AQS框架原理解析与实现类详解
  • 台湾网站建设公司/哪家网络公司比较好
  • 云建站微网站/线上推广营销
  • 网站建设的总结/友情链接模板
  • 网站建设psd/广州百度网站快速排名
  • 法律建设网站/怎么创建网页链接
  • 手机网站怎么打开/直接进网站的浏览器