如何在Java中让对象具备更灵活的行为扩展_利用策略模式

如何在java中让对象具备更灵活的行为扩展_利用策略模式

在Java开发中,当一个对象需要根据不同的场景表现出不同的行为时,直接使用继承或条件判断会让代码变得僵硬且难以维护。策略模式提供了一种优雅的解决方案——将可变的行为抽象出来,封装成独立的策略类,让对象在运行时动态切换行为,从而实现灵活扩展。

什么是策略模式

策略模式属于行为型设计模式,它定义了一系列算法或行为,并将每一个行为封装到独立的策略类中,使它们可以互相替换,而不会影响使用这些行为的客户端。

核心组成包括:

上下文(Context):持有策略接口的引用,负责调用具体策略执行行为策略接口(Strategy Interface):定义行为的公共方法具体策略(Concrete Strategy):实现策略接口,提供具体的行为逻辑

如何实现策略模式

以“支付方式”为例,系统可能支持支付宝微信、银行卡等多种支付方式,每种方式的处理逻辑不同。

立即学习“Java免费学习笔记(深入)”;

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

public class AlipayStrategy implements PaymentStrategy {public void pay(double amount) {System.out.println(“使用支付宝支付: ” + amount + “元”);}}

public class WechatPayStrategy implements PaymentStrategy {public void pay(double amount) {System.out.println(“使用微信支付: ” + amount + “元”);}}

public class PaymentContext {private PaymentStrategy strategy;

public void setStrategy(PaymentStrategy strategy) {    this.strategy = strategy;}public void executePayment(double amount) {    strategy.pay(amount);}

}

客户端使用时,可根据用户选择动态设置策略:

PaymentContext context = new PaymentContext();context.setStrategy(new AlipayStrategy());context.executePayment(99.9); // 输出:使用支付宝支付: 99.9元

context.setStrategy(new WechatPayStrategy());context.executePayment(150.0); // 输出:使用微信支付: 150.0元

策略模式的优势与适用场景

通过策略模式,你可以轻松实现行为的解耦和动态替换。

Poe Poe

Quora旗下的对话机器人聚合工具

Poe 607 查看详情 Poe 避免多重条件判断:无需使用 if-else 或 switch 判断支付方式易于扩展新行为:新增支付方式只需添加新的策略类,符合开闭原则提升代码可测试性:每个策略独立,便于单元测试运行时动态切换:上下文可在运行期间更换策略

适用于:算法选择(如排序、压缩)、业务规则变化频繁的场景、需要根据不同配置执行不同逻辑的情况。

结合函数式接口进一步简化

在Java 8+环境中,若策略行为较简单,可以直接使用函数式接口替代接口实现。

@FunctionalInterfacepublic interface DiscountStrategy { double applyDiscount(double price);}

public class PricingCalculator {private DiscountStrategy strategy;

public void setStrategy(DiscountStrategy strategy) {    this.strategy = strategy;}public double calculate(double price) {    return strategy.applyDiscount(price);}

}

使用Lambda表达式快速传入策略:

PricingCalculator calculator = new PricingCalculator();calculator.setStrategy(price -> price * 0.9); // 打9折System.out.println(calculator.calculate(100));

calculator.setStrategy(price -> Math.max(price – 20, 0)); // 满减20System.out.println(calculator.calculate(100));

这种方式更简洁,适合轻量级策略逻辑。

基本上就这些。策略模式通过把变化的行为封装出去,让对象的核心逻辑更稳定,同时具备高度可扩展性。不复杂但容易忽略。

以上就是如何在Java中让对象具备更灵活的行为扩展_利用策略模式的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/963530.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月1日 19:00:02
下一篇 2025年12月1日 19:00:55

相关推荐

  • MyBatis 中 XML 映射文件无法调用的问题排查与解决

    本文旨在帮助开发者解决在使用 Spring Boot 和 MyBatis 框架时,XML 映射文件中定义的 SQL 语句无法被正确调用的问题。文章将通过分析常见原因、提供解决方案以及代码示例,帮助读者快速定位并解决类似问题,确保 MyBatis 能够正确加载和执行 XML 映射文件中的 SQL 语句…

    2025年12月5日
    500
  • 抖音怎么挂自己的点单小程序

    在当前的数字化浪潮中,社交平台已成为品牌推广与商品销售的重要阵地。作为国内领先的短视频平台,抖音的活跃用户已突破1.5亿大关,为各类商家提供了广阔的营销空间。借助抖音平台,商家不仅能有效传播品牌形象,还能通过接入点单小程序,提升用户的购买效率和体验感。 什么是点单小程序? 点单小程序是一种基于微信生…

    2025年12月5日
    000
  • 如何在Laravel中集成支付网关

    在laravel中集成支付网关的核心步骤包括:1.根据业务需求选择合适的支付网关,如stripe、paypal或支付宝等;2.通过composer安装对应的sdk或laravel包,如stripe/stripe-php或yansongda/pay;3.在.env文件和config/services.…

    2025年12月5日
    300
  • Java中死锁如何避免 分析死锁产生的四个必要条件

    预防死锁最有效的方法是破坏死锁产生的四个必要条件中的一个或多个。死锁的四个必要条件分别是互斥、占有且等待、不可剥夺和循环等待;其中,互斥通常无法破坏,但可以减少使用;占有且等待可通过一次性申请所有资源来打破;不可剥夺可通过允许资源被剥夺打破;循环等待可通过按序申请资源解决。此外,reentrantl…

    2025年12月5日 java
    300
  • 如何利用JavaScript实现前端日志记录与用户行为分析?

    前端日志与用户行为分析可通过封装Logger模块实现,支持分级记录并上报;结合事件监听自动采集点击、路由变化等行为数据。 前端日志记录与用户行为分析能帮助开发者了解用户操作路径、发现潜在问题并优化产品体验。通过JavaScript,我们可以轻量高效地实现这些功能,无需依赖复杂工具也能获取关键数据。 …

    2025年12月5日
    000
  • 喜茶微信点单怎么用抖音券:详细教程及优惠攻略

    【引言】 作为新式茶饮的领军品牌,喜茶凭借其高品质原料与持续创新的产品赢得了广大消费者的喜爱。为提升服务效率与用户体验,喜茶全面上线了微信小程序点单功能,让用户无需排队即可完成下单。与此同时,喜茶携手抖音平台推出专属优惠活动——抖音券,进一步降低消费门槛。本文将为您全面解析如何在喜茶微信点单时使用抖…

    2025年12月5日
    000
  • 抖音的私信定位在哪里?私信功能有什么作用?

    作为广受欢迎的社交平台,抖音中的私信功能是用户沟通的重要方式之一。然而不少刚接触抖音的朋友常常困惑:私信到底在哪?它又能用来做什么? 一、抖音私信入口在哪里? 其实,抖音的私信入口设计得十分直观,主要分布在手机App和电脑端两个场景中。 手机端抖音App 这是大多数用户使用的操作方式,主要有两个常用…

    2025年12月5日
    000
  • 如何解决前端JS文件过大导致加载缓慢的问题,使用linkorb/jsmin-php助你轻松实现JS代码压缩优化

    可以通过一下地址学习composer:学习地址 在快节奏的互联网世界里,网站的加载速度是用户体验的生命线。用户往往没有耐心等待一个缓慢的页面,而搜索引擎也更青睐加载迅速的网站。作为一名开发者,我深知这一点,但最近在优化我的php项目时,却遇到了一个让人头疼的问题:前端的javascript文件随着功…

    开发工具 2025年12月5日
    000
  • 视频号视频怎么共享?如何设置隐私权限?

    微信视频号作为内嵌于微信生态的短视频平台,其分享机制与微信功能深度整合。那么,怎样才能将有趣的视频传递给更多人?又该如何在分享的同时守护好个人隐私? 一、视频号内容如何进行分享? 在视频号中分享视频操作简单,支持多种路径,可根据不同需求灵活选择。 发送给微信好友或群组 这是最常见且高效的分享方式。浏…

    2025年12月5日
    000
  • Java中Executors类的用途 掌握线程池工厂的创建方法

    如何使用executors创建线程池?1.使用newfixedthreadpool(int nthreads)创建固定大小的线程池;2.使用newcachedthreadpool()创建可缓存线程池;3.使用newsinglethreadexecutor()创建单线程线程池;4.使用newsched…

    2025年12月5日 java
    000
  • Java中jstat的用法 详解性能统计

    要使用jstat监控jvm,首先通过jps获取进程id,然后执行jstat命令并指定监控类型、采样间隔和次数。1)常用选项包括-gcutil查看垃圾回收利用率统计;2)-gc查看更详细的垃圾回收信息;3)-class监控类加载与卸载情况。例如:jstat -gcutil 1234 1000可每秒输出…

    2025年12月5日 java
    100
  • 鲍师傅抖音外卖怎么点单

    鲍师傅抖音外卖是一款广受用户喜爱的线上订餐平台,为消费者提供了高效便捷的用餐解决方案。接下来,我们将从多个方面详细介绍如何在该平台上顺利下单。 1. 获取并安装鲍师傅抖音外卖App 首先,请打开您手机上的应用商店(如苹果App Store或安卓各大市场),搜索“鲍师傅抖音外卖”,下载并完成安装。安装…

    2025年12月5日
    000
  • 《深海迷航》手机版与其他平台运行状况对比:博主称其游戏体验远超NS版

    近日,热门深海沙盒生存游戏《深海迷航》正式上线手机平台,知名游戏博主el analista de bits对手机版与switch和ps5版本进行了详细对比,一起来了解一下! 视频欣赏: 从实际演示来看,尽管在画面细节上有所缩减,但《深海迷航》手机版整体帧数表现稳定,操作体验也较为流畅。该博主表示,本…

    2025年12月5日 游戏教程
    000
  • Java中MANIFEST.MF的作用 详解清单文件

    manifest.mf是java中jar文件的元数据配置文件,位于meta-inf目录下,用于定义版本、主类、依赖路径等关键信息。1. 它允许指定入口类,使jar可直接运行;2. 通过class-path管理依赖,减少类加载冲突;3. 可配置安全权限,如设置沙箱运行;4. 常见属性包括manifes…

    2025年12月5日 java
    000
  • 淘票票怎么登录账号_淘票票账号登录入口与步骤

    无法登录淘票票可能是未正确登录账号,可通过支付宝、淘宝、手机号或微信小程序四种方式登录:1. 支付宝登录需在登录页选择支付宝并授权;2. 淘宝登录需点击手机淘宝选项并用App扫码确认;3. 手机号登录需注册新账号,输入手机号获取验证码并设置密码;4. 微信小程序登录可在微信中搜索淘票票小程序,进入后…

    2025年12月5日
    000
  • PHP中读取并输出文件内容:结合白名单校验的实践指南

    本教程详细介绍了如何在php中安全高效地读取文件内容并将其输出到客户端。通过一个白名单校验的实际案例,我们将演示如何利用`file_get_contents()`函数读取文件,并结合`__dir__`魔术常量处理文件路径,确保代码的健壮性和可移植性,同时提供最佳实践建议。 在PHP Web应用开发中…

    2025年12月5日
    000
  • OPPO Find X9系列新机首发ColorOS 16 10月16日发布

    10月14日,oppo正式宣布:find x9系列将全球首个搭载全新coloros 16操作系统。该系统在ai智能记录、跨平台互联以及便捷传输等功能上实现全方位进化。 OPPO Find X9 据CNMO消息,ColorOS 16全新推出的“AI一键闪记”功能,支持视频、账单、图片及语音内容的快速捕…

    2025年12月5日
    000
  • PHP move_uploaded_file 失败:权限问题解析与解决方案

    本文详细解析了PHP中使用move_uploaded_file函数上传文件时,因Permission denied错误导致文件保存失败的常见问题。教程将深入探讨该错误的根本原因——目标目录的写入权限不足,并提供了针对Linux/Unix系统下文件权限配置的实用解决方案,确保PHP文件上传功能稳定运行…

    2025年12月5日
    000
  • Safari缩放网站视图怎么调_Safari浏览器网页显示比例设置

    iPhone和iPad支持双指缩放、地址栏±按钮调字体及辅助功能设置默认缩放;2. Mac可通过快捷键、菜单栏或触控板手势调整Safari网页比例;3. 缩放可能影响排版且不永久保存,可结合设置优化显示效果。 在使用Safari浏览器时,调整网页的显示比例可以帮助你看清文字或图片细节。Safari提…

    2025年12月5日
    000
  • JS怎么实现悬浮窗拖拽 4行代码让元素支持鼠标自由拖拽

    js实现悬浮窗拖拽的核心是监听鼠标事件并更新位置。1. 优化性能:使用transform: translate()替代left和top以启用gpu加速,并通过节流函数限制mousemove触发频率;2. 限制范围:在mousemove中计算悬浮窗位置,确保不超出屏幕边界;3. 处理事件冲突:mous…

    2025年12月5日 web前端
    000

发表回复

登录后才能评论
关注微信