Java设计模式 十六 策略模式 (Strategy Pattern)

Java接口源码深度解析:从Function接口看Lambda实现与设计模式 在Java编程中,接口作为定义行为契约的核心机制,其设计原理深刻影响着代码架构。从概念层面看,接口通过抽象方法定义规范,而函数式接口则进一步支持Lambda表达式,这是Java函数式编程的基础。其实现原理涉及JVM的invokedynamic指令,该指令在运行时动态生成实现类,相比传统匿名内部类具有显著的性能优势,包括惰性加载和实例复用。这种技术价值在于提升了代码的简洁性和执行效率,同时为设计模式如策略模式、装饰器模式提供了优雅的实现方式。在应用场景上,接口广泛应用于Java标准库的Stream API、集 阅读详情

策略模式 (Strategy Pattern)

策略模式是一种行为型设计模式,它定义了一系列算法,将每个算法封装成一个独立的类,并使得它们可以互换。策略模式让算法的变化独立于使用算法的客户端。通过使用策略模式,我们可以动态地选择不同的算法,并将它们组合在一起。


1. 策略模式的组成

策略模式通常包含以下几个角色:

  • Context(上下文):使用某个具体策略的类。它通常持有一个Strategy类型的引用,并负责通过这个引用来执行具体的算法。
  • Strategy(策略接口):定义了所有支持的算法的共同接口,通常是一个抽象类或接口,里面包含一个execute()方法,供具体策略类实现。
  • ConcreteStrategy(具体策略类):实现了Strategy接口的具体算法类,每个类封装一个具体的算法。

2. 策略模式的工作流程

  1. 客户端通过上下文(Context)对象来选择某种策略。
  2. 上下文将策略对象传递给具体的算法类。
  3. 策略类执行对应的算法,并返回结果。

3. 策略模式的实现

场景示例:支付系统

假设我们需要实现一个支付系统,支持不同的支付方式(如:支付宝、微信支付、信用卡支付等)。通过策略模式,我们可以为每种支付方式定义一个策略类,并在运行时动态选择支付方式。


1) 定义策略接口

支付的策略接口定义了所有支付方式应具备的行为(如支付方法)。

// 支付策略接口
public interface PaymentStrategy {
    void pay(int amount); // 支付方法
}

2) 定义具体策略类

每个支付方式都实现了PaymentStrategy接口,封装了具体的支付算法。

// 支付宝支付
public class AlipayStrategy implements PaymentStrategy {
    @Override
    public void pay(int amount) {
        System.out.println("Using Alipay to pay: " + amount + " yuan.");
    }
}

// 微信支付
public class WeChatPayStrategy implements PaymentStrategy {
    @Override
    public void pay(int amount) {
        System.out.println("Using WeChat Pay to pay: " + amount + " yuan.");
    }
}

// 信用卡支付
public class CreditCardPayStrategy implements PaymentStrategy {
    @Override
    public void pay(int amount) {
        System.out.println("Using Credit Card to pay: " + amount + " yuan.");
    }
}

3) 定义上下文类

上下文类(PaymentContext)负责根据用户选择的支付方式来委托具体的策略类执行支付。

// 上下文类
public class PaymentContext {
    private PaymentStrategy paymentStrategy;

    // 设置支付策略
    public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
        this.paymentStrategy = paymentStrategy;
    }

    // 执行支付
    public void executePayment(int amount) {
        paymentStrategy.pay(amount);
    }
}

4) 客户端代码

客户端代码通过上下文类来选择不同的支付方式,并执行支付操作。

public class Client {
    public static void main(String[] args) {
        // 创建上下文类
        PaymentContext paymentContext = new PaymentContext();
        
        // 选择支付宝支付
        paymentContext.setPaymentStrategy(new AlipayStrategy());
        paymentContext.executePayment(100);  // 输出:Using Alipay to pay: 100 yuan.
        
        // 选择微信支付
        paymentContext.setPaymentStrategy(new WeChatPayStrategy());
        paymentContext.executePayment(200);  // 输出:Using WeChat Pay to pay: 200 yuan.
        
        // 选择信用卡支付
        paymentContext.setPaymentStrategy(new CreditCardPayStrategy());
        paymentContext.executePayment(300);  // 输出:Using Credit Card to pay: 300 yuan.
    }
}

运行结果:
Using Alipay to pay: 100 yuan.
Using WeChat Pay to pay: 200 yuan.
Using Credit Card to pay: 300 yuan.

4. 策略模式的优点

  1. 符合开闭原则: 增加新的支付方式只需要添加一个新的ConcreteStrategy类,而不需要修改现有的代码。
  2. 避免了大量的条件判断: 不需要使用if-else或switch-case来判断哪种支付方式,避免了复杂的条件语句。
  3. 易于扩展: 可以轻松添加新的策略,每种策略的实现都相对独立,不会影响其他部分。
  4. 可以动态切换策略: 客户端可以在运行时改变策略类,灵活控制不同的算法。

5. 策略模式的缺点

  1. 客户端必须了解所有策略: 上下文类需要知道所有可能的策略并选择一个。若策略过多,客户端的选择逻辑可能会变得复杂。
  2. 类的数量增加: 每一种策略都会增加一个新的类,这可能导致类的数量过多,增加系统复杂度。

6. 策略模式的应用场景

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

  1. 算法或行为的多种变体: 当同一个任务需要多个算法来处理时(例如,支付系统、排序算法等)。
  2. 客户端需要动态选择算法时: 如果算法在运行时可能会发生变化,策略模式就非常适用。
  3. 避免使用大量的if-else或switch-case: 通过策略模式将条件判断移到不同的策略类中,从而使代码更加简洁易懂。

7. 总结

策略模式通过将算法封装在独立的策略类中,使得算法的切换变得更加灵活。它避免了在代码中出现大量的条件判断,使得系统更加符合开闭原则,便于扩展和维护。尤其在面对需要多种行为或算法的场景下,策略模式提供了一种非常有效的解决方案。

【信息科学与工程学】计算机科学与自动化—第十五篇 云计算 11 算法篇01 编号类型领域问题问题的数学分析(含几何学/拓扑学/代数学/数论/集合论/离散数学/概率论/统计学/其他)及数值分析及算法分析及参数列表及参数数值设计C/C++/rust/python代码软件(含编译器)及硬件资源需求(CPU/GPU/内存【NAND/DRAM/HBM/其他】/HBM、HDD、SSD、RAID卡、其他)关联知识1工作负载调度数据中心最小化总完成时间/成本。 阅读详情

相关推荐

Blender骨骼绑定实战:如何用IK控制器让角色动作更自然(附常见问题解决)

本文深入探讨了Blender中IK控制器的实战应用,旨在解决角色动作僵硬问题。通过对比IK与FK的核心差异,详细解析了IK链的构建、参数设置及极向目标的使用,并提供了控制器定制、IK/FK无缝切换等高级技巧,帮助动画师实现更自然、符合直觉的角色动画。

weixin_29243279的博客 436

java数据结构与算法总结(十六)--策略模式(Strategy Pattern) 介绍 优缺点 使用场景案例及代码演示

一句话概括: 一个类的行为或算法可以在运行时更改。 补充介绍: 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改,这种类型的设计模式属于行为型模式。 Strategy的意思是“策略”,指的是与敌军对垒时行军作战的方法。 在策略模式中,我们创建各种表示策略的对象和一个行为随着策略对象改变而改变的context对象。策略对象改变context对象的执行算法。...

秋天的猿 749

从零到一:R与RStudio的安装与配置全攻略

本文提供了R与RStudio的完整安装与配置指南,涵盖Windows、Mac和Linux三大操作系统。从基础环境搭建到高级性能优化,详细介绍了R语言安装、RStudio配置、项目管理和实用技巧,帮助数据科学初学者快速搭建高效的分析工作环境。

weixin_29062671的博客 419

Java中的24种设计模式

一、策略模式【STRATEGY PATTERN】 二、代理模式【PROXY PATTERN】 三、单例模式【SINGLETON PATTERN】 四、多例模式【MULTITION PATTERN】 五、工厂方法模式【FACTORY METHOD PATTERN】 六、抽象工厂模式【ABSTRACT FACTORY PATTERN】 七、门面模式【FACADE PATTERN】 八、适

814

从IPv6到Tomcat:彻底解决127.0.0.1拒绝连接的完整指南

本文提供了从IPv6到Tomcat的全面指南,帮助开发者彻底解决127.0.0.1拒绝连接的问题。涵盖网络协议栈、服务配置、端口管理等多个层面的排查方法,特别针对Tomcat服务提供了专项解决方案,确保开发者能够快速定位并修复连接问题。

weixin_29207439的博客 471

网易 广州 梦幻西游端游 客户端社招笔试题 2024

4道算法题,时间2小时,牛客网笔试注:采用OJ模式,需要自己处理输入、输出。

z2014z的博客 1812

软件工程术语库:从字符编码到设计模式的实战解读

字符编码是计算机处理文本的基石,它将人类可读字符映射为二进制数字。从ASCII到Unicode,再到GBK与UTF-8的转换,理解字符集与编码方案的差异是避免乱码和数据损坏的关键。在跨平台开发中,正确处理GBK转UTF-8、显式指定读写编码,是工程实践中高频遇到的硬技能。而软件工程领域的“编码”不止字符编码,还包含代码风格规范——如PEP8编码风格,以及解决复杂软件结构的设计模式。掌握这些基础概念与原则,能够帮助开发者写出规范、稳定且可维护的代码。本文以软件工程术语库的形式,梳理从底层编码到高层设计的关键知

weixin_34006468的博客 343

ComfyUI 本地部署指南:概念、部署过程、生成图片、共享 WebUI 模型

ComfyUI 是一个基于节点的 Stable Diffusion 图形化用户界面。您可以通过将不同的节点连接在一起来构建生成图像的工作流程。一些常用的节点包括加载检查点模型(Load Checkpoint)、输入提示词(CLIP Text Encode)、指定采样器(KSampler)等。ComfyUI 将工作流程分解为可重新排列的元素,以便您可以轻松创建自己的元素。

水滴的博客 5032

【C++高阶系列】从“会写代码”到“会设计”:策略、工厂、建造者与代理模式详解

本文介绍了C++中的设计模式概念,重点探讨了策略模式的应用场景。设计模式是前人总结的可复用解决方案,用于解决常见软件设计问题。文章以日志系统为例,对比了同步日志和异步日志的实现差异:同步日志由业务线程直接完成IO操作,可能阻塞后续业务;异步日志则将耗时IO交给后台线程处理,提升效率。策略模式适用于这种目标相同但实现方式多样的场景,避免代码臃肿。作者强调设计模式应结合实际需求使用,而非生搬硬套。文章还回顾了单例模式的实现要点,为后续设计模式的讲解奠定基础。 (字数:149)

努力努力再努力wz的博客 287

194、产线 Camera 校准与测试:终检测试项、规格线制定与量产数据监控

摘要: 文章通过"绿屏门"案例揭示了产线Camera校准测试中的关键问题,提出了系统性改进方案。在终检测试方面,建议增加多增益暗电流测试、混合光源色温测试和径向亮度梯度测试,覆盖用户真实场景。规格线制定强调用CPK替代固定百分比,区分硬软规格并建立动态调整机制。量产监控需关注参数趋势、边界模组分布,构建失效模式数据库。实践建议包括测试冗余设计、规格余量预留、自动化监控、供应商数据共享和人工抽检保留。文章指出Camera产线质量管控需形成"测试设计-规格优化-数据监控"闭环,以数据驱动决策避免客诉风险。

sundong_81的博客 191

英飞凌TC3xx之一起认识GTM系列(一)先来认识GTM架构

本文讲述英飞凌TC3xx的通用计时器GTM的架构。

无所适从的我的博客 4594

Java实现SZY206-2016电力规约解析:从字节流到业务数据的实战指南

在工业自动化与能源系统领域,数据通信协议是实现设备互联与实时监控的技术基石。其核心原理在于定义一套标准的二进制报文格式,确保不同厂商设备间的数据能够准确、高效地交换。掌握协议解析技术,对于构建可靠的厂站端数据采集与主站系统集成方案具有关键价值。典型的应用场景包括电力系统实时动态监测、水利自动化以及各类需要可靠数据传输的工业控制环境。本文聚焦于电力行业广泛采用的SZY206-2016规约,针对其复杂的帧结构与数据格式,详细阐述了使用Java进行底层字节操作、帧定界状态机设计以及面向对象建模的完整解析流程。通过

weixin_30824479的博客 267

AutoSAR配置视频讲解:新建DaVinci工程

AutoSAR实验视频讲解:闪烁一颗LED实验【新建DaVinci工程】 上一篇 | 下一篇 | 总目录 实验架构图 视频本频放在了文末,下图描述了本次实验配置内容在AutoSAR架构中的位置,供大家参考 实验内容 本节课程讲解新建DaVinci工程,听上去新建工程很简单,但是还是需要很多的准备工作和细节。主要内容是新建工程和导入dbc文件和导入arxml文件的方法 主要步骤 新建DaVinci工程 导入.dbc通信矩阵文件 导入Mcal的arxml文件 实验视频2:Mcal配置 提示:版权所在,违

雪云飞星的博客 6275

数据脱敏实战:从原理到实现,构建隐私保护工具链

数据脱敏是数据安全领域的一项基础且关键的技术,其核心原理是通过对敏感信息进行变形、替换或隐藏,使其无法直接关联到特定个人,同时尽可能保留数据的业务价值。这项技术的核心价值在于实现“主动防御”,在数据产生、流转和展示的早期环节就嵌入保护,有效防范隐私泄露风险。它广泛应用于日志记录、数据展示、测试数据准备等多个场景,尤其是在开发调试、后台管理系统和对外数据交换中至关重要。例如,在类似“屏幕共享隐私保护”的场景中,脱敏技术能确保共享时不会意外暴露后台的敏感信息;而在处理“收件人电话地址”时,它能将完整信息转换为部

weixin_33924220的博客 371

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C++ 继承 多态 组合 从运用到底层原理详解!草履虫也能轻松看懂

本文详细讲解了C++面向对象编程中的继承、多态和组合三大核心概念。继承部分介绍了基本语法、访问权限、构造析构顺序等;多态部分阐述了虚函数机制、纯虚函数、对象切片等;组合部分则分析了强组合和弱组合的实现方式。文章还对比了组合与继承的优缺点,强调"优先使用组合"的设计原则。

我的博客主要是用来给我自己复习的,主要是上传一些知识点,小型的项目和功能模块,如果有什么问题或错误麻烦联系我! 3038

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

面试问题合集

回答结构(STAR法则)“我介绍一个智能门禁系统的项目。项目背景:这是一个基于Qt和OpenCV的跨平台门禁系统,解决小区/办公室的访客管理和门禁授权问题。我的职责:我独立完成了人脸识别模块和数据库模块。技术实现:人脸识别用OpenCV的Haar Cascade做检测,然后通过灰度化、缩放到32x32、归一化提取特征向量,匹配时用余弦相似度。数据库用SQLite,我用Repository模式封装了数据访问。重难点:性能优化方面,我把视频处理放到子线程避免卡界面;

丰锋的博客 240

Spring AI + GPT-5.5 + Ollama 配置教程:Base URL、超时与流式调用

由于不同 Spring AI、Spring Boot 小版本之间仍可能存在差异,创建项目时应检查 Spring Initializr、Spring AI BOM 和官方兼容矩阵,不要直接复制旧教程中的 Starter 名称和版本号。多人项目最好隔离不同客户端,并在脱敏前提下记录最终 URL、状态码、请求耗时、请求 ID 和模型 ID。Spring AI 接入模型 API,至少要同时确认 Starter、Base URL、请求路径、API Key、模型 ID、连接超时、读取超时和流式客户端这 8 项。

2601_95893075的博客 218

【JVM】对象内存布局

HotSpot JVM 中,Java 对象内存布局由对象头(12字节,含Mark Word与压缩Klass Pointer)、实例数据及对齐填充构成,总大小为8字节倍数。对象头支持锁状态动态复用,指针压缩使引用仅4字节,但堆超32GB时失效。实例字段按类型优先级重排序以减少间隙,最小对象大小为16字节。通过JOL工具可精准验证布局,理解锁机制、GC、伪共享等底层行为。

2301_79732484的博客 148

V8 机制、手写核心函数与 TypeScript 类型体操

或固定初始化(如数组先定长、对象先给全字段)保持类型与形状稳定;这些都比"换框架"更基础。只能处理纯数据(丢函数、Date、RegExp、循环引用报错)。生产级深拷贝要处理:原始值短路、循环引用、V8(Chrome / Node 的 JS 引擎)不是"解释一行跑一行"那么简单,它用。图:V8 执行流程——解释执行 + 热点优化,优化失败会 Deopt 回退。JS 内存自动管理,但"自动"不等于"不会漏"。是"固定间隔最多执行一次"。手写 Promise 是"懂异步"的试金石。是"停下后才执行最后一次",

qq_38468358的博客 327

Spring Boot 数据源与 MyBatis(-Plus) 自定义配置详解

本文详解 Spring Boot 中单数据源环境下 HikariCP 与 MyBatis-Plus 的自定义配置。通过手动声明 SqlSessionFactory,实现下划线转驼峰、日志输出、一级缓存策略等精细化控制。结合 HikariCP 核心参数调优(如最大连接数、连接生命周期),确保高性能与稳定性。适用于仅需访问单一数据库的场景,避免多数据源复杂性,兼顾性能与可维护性。

BADAO_LIUMANG_QIZHI的博客 191

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

要努力去发光,而不是被照亮~ 114

LeetCode Hot 100 二叉树专题(二)3 题(Java)

本篇文章共 3 题:543. 二叉树的直径、102. 二叉树的层序遍历、108. 将有序数组转换为二叉搜索树。 每道题都统一按「① 题目分析 & 解题思路 → ② 常见解法(附代码)及讲解 → ③ 知识点总结」的顺序组织;代码使用 Java 编写,节点定义沿用 LeetCode 默认的 TreeNode。

2401_88612756的博客 352

Decorator

TaskDecorator 是异步场景下"跨线程传递上下文"的标准方案,主要用于传递 MDC、用户信息、数据源路由等上下文数据,核心价值是让异步任务的日志链路不中断、业务上下文不丢失。TaskDecorator 是 Spring 提供的一个钩子接口,用于在异步任务执行前对 Runnable 进行包装,常用于跨线程传递上下文。如果你在项目中遇到具体的异步上下文传递问题,可以把代码贴出来,我帮你给出最合适的 Decorator 方案 👍。✅ 核心能力:在线程切换时,把"父线程的上下文"搬到"子线程"

wlwork66的博客 102

JDK 下载安装:装完 Java 提示「不是内部或外部命令」?环境变量没配

JDK 是写 Java 程序必须装的东西。它包含运行 Java 的虚拟机(JRE)和编译 Java 的编译器(javac)——装了它,能跑、.java文件能编译成可执行程序。免费,学习和小规模生产都不花钱。

科小怪的博客 623

数据库乐观锁深度解析:MySQL、PostgreSQL 实战 + Spring Boot 集成指南

Oracle 提供了ORA_ROWSCN伪列(System Change Number),记录最后修改行的 SCN,类似 PostgreSQL 的xmin。实践中通常仍使用 version 字段方案,逻辑与 MySQL 完全相同。-- Oracle:通过 ORA_ROWSCN 实现乐观锁-- 更新时比对 SCN// 自定义注解// AOP 切面@Aspect@Component@Slf4jtry {

yjc_1111的专栏 393

C++ 多态详解:作用、原理与实战用法

多态是C++面向对象的核心特性,通过虚函数实现运行期动态绑定,使同一接口在不同对象上表现出不同行为。其核心作用包括统一接口、提升可扩展性、降低耦合、支持运行时分派与批量处理。实现依赖虚函数表(vtable)和虚指针(vptr),需注意虚析构函数、对象切片等陷阱。相比编译期多态(模板),运行期多态灵活性高但有调用开销。合理结合两者,可兼顾代码的灵活性与性能,是构建可扩展、低耦合系统的关键。

2402_85743155的博客 369
上一篇: Java设计模式 十五 观察者模式 (Observer Pattern)
下一篇: Java设计模式 二十四 设计模式组合
十方来财
十方来财 新星创作者: 编程框架技术领域 新星创作者: 编程框架技术领域
博客等级 码龄14年 8354粉丝 346原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

十方来财

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

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

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

打赏作者

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

抵扣说明:

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

余额充值