大众创新网官方网站首页应届毕业生招聘官网

张小明 2025/12/27 3:41:45
大众创新网官方网站首页,应届毕业生招聘官网,长沙网站制作app开发公司,西安制作网站的电话常开发中#xff0c;我们经常会遇到需要根据不同条件执行不同逻辑的场景#xff0c;导致代码中出现大量的if/else嵌套。这不仅降低了代码的可读性和可维护性#xff0c;还会增加后续扩展的难度。本文将介绍四种优雅的设计模式来优化这种条件爆炸问题#xff1a…常开发中我们经常会遇到需要根据不同条件执行不同逻辑的场景导致代码中出现大量的if/else嵌套。这不仅降低了代码的可读性和可维护性还会增加后续扩展的难度。本文将介绍四种优雅的设计模式来优化这种条件爆炸问题1 策略模式01 概念首先我们来看下策略模式的定义。策略模式Strategy Pattern是行为型设计模式之一它定义了一系列算法并将每个算法封装起来使它们可以相互替换。 策略模式使得算法可以独立于使用它们的客户端变化。怎么理解策略模式 软件开发中常常遇到这种情况实现某一个功能有多种算法或者策略我们需要根据环境或者条件的不同选择不同的算法或者策略来完成该功能。这么一看不就是 if...else...的逻辑 图中的实现逻辑非常简单当我们是初学者时这样写没有问题只要能正常运行即可。但随着经验的增长这段代码明显违反了 OOP 的两个基本原则单一职责原则一个类或模块只负责完成一个职责或功能。开闭原则软件实体模块、类、方法等应该“对扩展开放对修改关闭”。由于违反了这两个原则当 if-else 块中的逻辑日益复杂时代码会变得越来越难以维护极容易出现问题。策略模式的设计思路是定义一些独立的类来封装不同的算法每一个类封装一个具体的算法。每一个封装算法的类我们都可以称之为策略 (Strategy) 为了保证这些策略的一致性一般会用一个抽象的策略类来做算法的定义而具体每种算法则对应于一个具体策略类。这种设计思想里包含三个角色Context: 环境类Strategy: 抽象策略类ConcreteStrategy: 具体策略类对应的时序图接下来我们用代码简单演示一下。02 例子步骤 1创建接口public interface Strategy {public int doOperation(int num1, int num2);}Strategy 接口定义了一个 doOperation 方法所有具体策略类将实现这个接口以提供具体的操作。步骤 2创建实现相同接口的具体类OperationAdd 是一个具体的策略类实现了加法操作。public class OperationAdd implements Strategy{Overridepublic int doOperation(int num1, int num2) {return num1 num2;}}OperationSubtract 是另一个具体的策略类实现了减法操作。public class OperationSubtract implements Strategy{Overridepublic int doOperation(int num1, int num2) {return num1 - num2;}}OperationMultiply 是第三个具体的策略类实现了乘法操作。public class OperationMultiply implements Strategy{Overridepublic int doOperation(int num1, int num2) {return num1 * num2;}}步骤 3创建上下文类public class Context {private Strategy strategy;public void setStrategy(Strategy strategy) {this.strategy strategy;}public int executeStrategy(int num1, int num2) {return strategy.doOperation(num1, num2);}}Context 类持有一个策略对象的引用并允许客户端设置其策略。它提供了一个 executeStrategy 方法用于执行策略并返回结果。步骤 4使用上下文来看到策略改变时的行为变化public static void main(String[] args) {Context context new Context();context.setStrategy(new OperationAdd());System.out.println(10 5 context.executeStrategy(10, 5));context.setStrategy(new OperationSubstract());System.out.println(10 - 5 context.executeStrategy(10, 5));context.setStrategy(new OperationMultiply());System.out.println(10 * 5 context.executeStrategy(10, 5));}执行结果从上面的例子我们简单总结下策略模式的优缺点1、优点策略模式提供了对“开闭原则”的完美支持用户可以在不修改原有系统的基础上选择算法或行为也可以灵活地增加新的算法或行为。策略模式提供了管理相关的算法族的办法。使用策略模式可以避免使用多重条件转移语句。2、缺点客户端必须知道所有的策略类并自行决定使用哪一个策略类。策略模式将造成产生很多策略类可以通过使用享元模式在一定程度上减少对象的数量。2 SPI 机制01 概念SPI 全称为 Service Provider Interface是一种服务发现机制。SPI 的本质是将接口实现类的全限定名配置在文件中并由服务加载器读取配置文件加载实现类。这样可以在运行时动态为接口替换实现类。正因此特性我们可以很容易的通过 SPI 机制为我们的程序提供拓展功能。02 Java SPI JDBC Driver在JDBC4.0 之前我们开发有连接数据库的时候通常先加载数据库相关的驱动然后再进行获取连接等的操作。// STEP 1: Register JDBC driverClass.forName(com.mysql.jdbc.Driver);// STEP 2: Open a connectionString url jdbc:xxxx://xxxx:xxxx/xxxx;Connection conn DriverManager.getConnection(url,username,password);JDBC4.0之后使用了 Java 的 SPI 扩展机制不再需要用 Class.forName(com.mysql.jdbc.Driver) 来加载驱动直接就可以获取 JDBC 连接。接下来我们来看看应用如何加载 MySQL JDBC 8.0.22 驱动首先 DriverManager类是驱动管理器也是驱动加载的入口。/*** Load the initial JDBC drivers by checking the System property* jdbc.properties and then use the {code ServiceLoader} mechanism*/static {loadInitialDrivers();println(JDBC DriverManager initialized);}在 Java 中static 块用于静态初始化它在类被加载到 Java 虚拟机中时执行。静态块会加载实例化驱动接下来我们看看loadInitialDrivers 方法。加载驱动代码包含四个步骤系统变量中获取有关驱动的定义。使用 SPI 来获取驱动的实现类字符串的形式。遍历使用 SPI 获取到的具体实现实例化各个实现类。根据第一步获取到的驱动列表来实例化具体实现类。我们重点关注 SPI 的用法首先看第二步使用 SPI 来获取驱动的实现类 , 对应的代码是ServiceLoaderDriver loadedDrivers ServiceLoader.load(Driver.class);这里没有去 META-INF/services目录下查找配置文件也没有加载具体实现类做的事情就是封装了我们的接口类型和类加载器并初始化了一个迭代器。接着看第三步遍历使用SPI获取到的具体实现实例化各个实现类对应的代码如下IteratorDriver driversIterator loadedDrivers.iterator();//遍历所有的驱动实现while(driversIterator.hasNext()) {driversIterator.next();}在遍历的时候首先调用driversIterator.hasNext()方法这里会搜索 classpath 下以及 jar 包中所有的META-INF/services目录下的java.sql.Driver文件并找到文件中的实现类的名字此时并没有实例化具体的实现类。然后是调用driversIterator.next()方法此时就会根据驱动名字具体实例化各个实现类了现在驱动就被找到并实例化了。这里有一个小小的疑问 那么如果发现了多个 driver 的话要选择哪一个具体的实现呢那就是 JDBC URL 了driver 的实现有一个约定如果 driver 根据 JDBC URL 判断不是自己可以处理的连接就直接返回空DriverManager 就是基于这个约定直到找到第一个不返回 null 的连接为止。JDBC Driver 是 Java SPI 机制的一个非常经典的应用场景包含三个核心步骤定义 SPI 文件 指定 Driver class 全限定名 通过 DriverManager 静态类自动加载驱动 加载之后当需要获取连接时还需要根据 ConnectionUrl 判断使用哪一个加载完成的 Driver 。因此 JDBC Driver 的 SPI 机制是需要多个步骤配合来完成的 同时基于 Java SPI 机制的缺陷同样也无法按需加载。03 按需加载Dubbo SPI 机制基于 Java SPI 的缺陷无法支持按需加载接口实现类Dubbo 并未使用 Java SPI而是重新实现了一套功能更强的 SPI 机制。Dubbo SPI 的相关逻辑被封装在了 ExtensionLoader 类中通过 ExtensionLoader我们可以加载指定的实现类。Dubbo SPI 所需的配置文件需放置在 META-INF/dubbo 路径下配置内容如下optimusPrime org.apache.spi.OptimusPrimebumblebee org.apache.spi.Bumblebee与 Java SPI 实现类配置不同Dubbo SPI 是通过键值对的方式进行配置这样我们可以按需加载指定的实现类。另外在测试 Dubbo SPI 时需要在 Robot 接口上标注 SPI 注解。下面来演示 Dubbo SPI 的用法public class DubboSPITest {Testpublic void sayHello() throws Exception {ExtensionLoaderRobot extensionLoader ExtensionLoader.getExtensionLoader(Robot.class);Robot optimusPrime extensionLoader.getExtension(optimusPrime);optimusPrime.sayHello();Robot bumblebee extensionLoader.getExtension(bumblebee);bumblebee.sayHello();}}测试结果如下 另外Dubbo SPI 除了支持按需加载接口实现类还增加了 IOC 和 AOP 等特性 。SPI 机制的优势实现完全解耦新增实现无需修改主代码支持运行时动态发现和加载3 责任链模式01 概念责任链模式是一种行为设计模式 允许你将请求沿着处理者链进行发送。 收到请求后 每个处理者均可对请求进行处理 或将其传递给链上的下个处理者。更简单的描述是责任链是一个链表结构这条链上有多个节点它们有相同的接口各自有各自的责任和实现。当有数据输入时第一个节点看自己能否处理问题如果可以就进行处理如果不能就数据交给下一个节点进行处理以此类推直到最后一个责任节点。责任链模式的使用场景是有多个对象可以处理同一个请求具体由哪个对象处理是在运行时确定的。例如有 ABC 三个处理者可以处理一个请求请求 a 需要 AC 两个处理者处理请求 b 需要 BC 两个处理者处理同时两个处理者之间可能有前后依赖关系这时候就可以使用责任链模式在不确定请求处理者的时候向同一类型的处理者中的一个发送请求02 例子笔者曾经通过责任链模式优化神州专车支付流程 。支付流程是通过定时任务执行每次都需要去判断用户的账号余额、优惠券、企业账号余额是否可以抵扣假如满足条件则从对应的账号资产里扣除对应的金额 。因为原来的代码存在大量的 if/else 逻辑业务逻辑相互杂糅维护成本很高勇哥花了一周时间重构了该逻辑 , 以下是演示伪代码1、定义抽象处理者Handler/*** 支付处理器接口* 定义所有支付方式需要实现的方法*/public interface PaymentHandler {/*** 判断该支付处理器是否适用于当前用户* param userId 用户ID* return 是否适用*/boolean canProcess(String userId);/*** 执行支付操作* param userId 用户ID* param amount 支付金额* return 支付结果*/PaymentResult processPayment(String userId, double amount);}/*** 支付结果类* 封装支付操作的结果信息*/class PaymentResult {private boolean success; // 支付是否成功private double paidAmount; // 实际支付金额private String message; // 支付结果描述信息public PaymentResult(boolean success, double paidAmount, String message) {this.success success;this.paidAmount paidAmount;this.message message;}// Getter方法public boolean isSuccess() {return success;}public double getPaidAmount() {return paidAmount;}public String getMessage() {return message;}}2、定义具体处理者Concrete Handler/*** 企业账户支付处理器实现*/public class CorporatePaymentHandler implements PaymentHandler {private static final double MAX_CORPORATE_PAYMENT 5000; // 企业账户最大支付限额Overridepublic boolean canProcess(String userId) {// 只有以emp_开头的用户ID才能使用企业账户支付return userId.startsWith(emp_);}Overridepublic PaymentResult processPayment(String userId, double amount) {System.out.printf(尝试使用企业账户支付: 用户[%s], 金额[%.2f]%n, userId, amount);if (amount MAX_CORPORATE_PAYMENT) {// 金额在限额内全额支付return new PaymentResult(true, amount, 企业账户支付成功);} else {// 超过限额只支付限额部分return new PaymentResult(true, MAX_CORPORATE_PAYMENT,String.format(企业账户部分支付成功(%.2f)还需支付: %.2f,MAX_CORPORATE_PAYMENT, amount - MAX_CORPORATE_PAYMENT));}}}/*** 个人账户支付处理器实现*/public class PersonalPaymentHandler implements PaymentHandler {
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

做外贸网站怎么样wordpress搜狗

哔哩哔哩漫画下载器完全使用手册:打造专属数字漫画收藏库 【免费下载链接】BiliBili-Manga-Downloader 一个好用的哔哩哔哩漫画下载器,拥有图形界面,支持关键词搜索漫画和二维码登入,黑科技下载未解锁章节,多线程下载&…

张小明 2025/12/26 6:04:09 网站建设

夫妻工作室网站建设customizr wordpress

💓 博客主页:借口的CSDN主页 ⏩ 文章专栏:《热点资讯》 目录一、AI创业:从"人肉智能"到真科技 二、AI创作:当梵高遇见代码 三、AI日常:你家的扫地机器人也在偷偷进化 四、AI的坑:当科…

张小明 2025/12/26 6:04:07 网站建设

做同城网站北湖区网站建设服务商

1. 系统总体概述 点击链接下载设计资料:https://download.csdn.net/download/qq_39020934/92091146 1.1 设计背景 在工业加热、实验室设备以及小型锅炉控制系统中,温度控制的精度、稳定性和安全性直接影响设备运行效率与使用寿命。随着自动化技术的发展…

张小明 2025/12/26 6:04:07 网站建设

做商城网站都需要什么兰州东方商易文化传播有限责任公司

内容速览:印度游戏行业迎来数据隐私新规2026年移动游戏下载量或将降至疫情前水平《Gossip Harbor》在10月创下二合类游戏收入新纪录日本新规生效,苹果、谷歌开放第三方支付索尼与腾讯达成和解,双方期待未来继续合作B站捉宠手游《闪耀吧&#…

张小明 2025/12/26 6:04:08 网站建设

江门市网站开发电子商务的分类

属性的set和get访问器internal class Program {static void Main(string[] args){//属性:public int Age{get;set},一般不存储数据,可以公开接口,可以在外部进行访问//字段:private int age 字段可以存储数据,一般定义成私有的,目…

张小明 2025/12/26 6:04:10 网站建设

公司官方网站开发html怎么做网站设计

我最近在分析一组行业调研数据:在过去三年里,国内超过68%的IT组织仍以“系统可用率”和“设备健康度”作为核心绩效指标,而只有不到20%的企业将“用户体验”列入服务管理的核心目标。这组数据其实暴露了一个深层问题——我们的IT管理仍然停留…

张小明 2025/12/26 6:04:11 网站建设