Java设计模式实战:策略模式、工厂模式、模板模式组合使用

devtools/2024/12/23 1:51:19/

Java设计模式实战:策略模式、工厂模式、模板模式组合使用

在软件开发中,设计模式是解决特定问题的成熟模板。它们可以帮助我们写出更灵活、更可维护的代码。本文将通过一个充电场景为例,展示如何将策略模式(Strategy Pattern)、工厂模式(Factory Pattern)和模板方法模式(Template Method Pattern)结合起来,以实现一个灵活且可扩展的充电系统。

策略模式

java">public interface ChargingStrategy {void charge();String getSign();
}

这个接口定义了所有充电策略必须实现的charge方法和getSign方法,后者用于返回策略的唯一标识。

模板模式

模板方法模式是一种行为设计模式,它在方法中定义了一个算法的框架,将一些步骤延迟到子类中实现。这让我们可以在不改变算法结构的情况下重新定义算法的某些步骤。在示例中,ChargingTemplate类就是一个模板方法的实现。

java">public abstract class ChargingTemplate implements ChargingStrategy {/*** 模板方法,定义充电的步骤*/@Overridepublic final void charge() {securityCheck();initiateCharging();chargingSettlement();}/*** 安全检查*/private void securityCheck() {System.out.println("Security check completed.");}/*** 启动充电*/protected abstract void initiateCharging();/*** 充电结算*/private void chargingSettlement() {System.out.println("Charging process finalized. Thank you!");}
}

这个抽象类定义了充电的步骤,包括安全检查、启动充电和充电结算。initiateCharging方法是一个抽象方法,需要在具体的充电策略中实现。

工厂模式

工厂模式是一种创建型设计模式,它提供了一个创建对象的接口,让子类决定实例化哪一个类。工厂模式使一个类的实例化延迟到其子类。在我们的充电系统中,ChargingFactory类就是一个工厂模式的实现。

java">@Component
public class ChargingFactory {private final Map<String, ChargingStrategy> strategies = new HashMap<>();@Autowiredpublic ChargingFactory(List<ChargingStrategy> strategyList) {for (ChargingStrategy strategy : strategyList) {registerStrategy(strategy);}}private void registerStrategy(ChargingStrategy strategy) {strategies.put(strategy.getSign(), strategy);}public ChargingStrategy getChargingStrategy(String type) {ChargingStrategy strategy = strategies.get(type);if (strategy == null) {throw new IllegalArgumentException("Unknown charging type: " + type);}return strategy;}
}

这个工厂类负责注册和获取充电策略实例。它通过一个map集合来管理所有可用的充电策略,并根据传入的类型标识来返回相应的策略实例。

策略类

常规充电

java">@Component("RegularCharging")
public class RegularCharging extends ChargingTemplate {@Overrideprotected void initiateCharging() {System.out.println("Start regular charging.");}@Overridepublic String getSign() {return "REGULAR";}
}

快速充电

java">@Component("FastCharging")
public class FastCharging extends ChargingTemplate {@Overrideprotected void initiateCharging() {System.out.println("Start fast charging.");}@Overridepublic String getSign() {return "FAST";}
}

超级快充

java">@Component("SuperFastCharging")
public class SuperFastCharging extends ChargingTemplate {@Overrideprotected void initiateCharging() {System.out.println("Start super fast charging.");}@Overridepublic String getSign() {return "SUPERFAST";}
}

每个策略类都实现了initiateCharging方法,并提供了一个唯一的标识符。这些类被注册到ChargingFactory中,以便可以根据需要获取和使用。

结论

通过将策略模式、工厂模式和模板方法模式结合起来,我们创建了一个灵活且可扩展的充电系统。这种设计当我们增加策略时只需要添加策略类即可,不需要额外操作。同时,它也保持了代码的清晰和可维护性。这种模式的组合是解决复杂问题的强大工具,值得在实际项目中广泛应用。


http://www.ppmy.cn/devtools/144547.html

相关文章

相机主要调试参数

解析度测试 - 解释如何衡量摄像头捕捉细节的能力&#xff0c;确保图像清晰。锐度评估 - 教你如何判断图像边缘的清晰程度&#xff0c;以优化视觉效果。色散与色彩还原 - 分析色彩准确性&#xff0c;确保所见即所得的色彩一致性。白平衡校正 - 确保在各种光源下拍摄的照片颜色自…

基础数据结构---栈

顺序表实现 一、栈类的声明 栈是一种特殊的线性表&#xff0c;可以由顺序表来实现&#xff0c;也可以由链表来实现&#xff0c;这节课&#xff0c;我们采用顺序表来实现栈。 #include <iostream>#include <stdexcept>using namespace std;template<typename …

Sentinel 学习笔记2- 概念与核心类介绍

本文属于sentinel学习笔记系列。网上看到吴就业老师的专栏&#xff0c;原文地址如下&#xff1a; https://blog.csdn.net/baidu_28523317/category_10400605.html 基本概念 basic-api-resource-rule | Sentinel 官网的基本概念介绍 资源 是 Sentinel 中的核心概念之一。最…

第三章补充:拉格朗日乘子法(B站:中华科技大学-李柏坚)

原视频&#xff1a;28-9 拉格朗日乘数_哔哩哔哩_bilibili 我们现在来介绍一下拉格朗日乘子法的用途&#xff1a; 上图&#x1f446;是一个三维空间的曲面&#xff0c;我们现在给它一个限制条件&#xff0c;来求它的极值。 如上图&#x1f446;&#xff0c;假设曲面为&#xff…

html+css网页设计 美食 爱美食1个页面

htmlcss网页设计 美食 爱美食1个页面 网页作品代码简单&#xff0c;可使用任意HTML辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 1&#xff0…

文心一言对接FreeSWITCH实现大模型呼叫中心

文心一言对接FreeSWITCH实现大模型呼叫中心 作者&#xff1a;开源大模型智能呼叫中心FreeIPCC&#xff0c;Github&#xff1a;https://github.com/lihaiya/freeipcc 随着人工智能技术的快速发展&#xff0c;特别是大规模语言模型&#xff08;LLM&#xff09;的应用&#xff0…

Qt之样式表使用(十一)

Qt开发 系列文章 - stylesheet&#xff08;十一&#xff09; 目录 前言 一、样式表stylesheet 二、代码更改 1.特定控件样式 ​编辑 2.类型选择器样式 3.ID选择器样式 三、UI上设计 四、qss文件设计 总结 前言 Qt是一个跨平台的C图形用户界面应用程序开发框架&#…

【论文速读】| FirmRCA:面向 ARM 嵌入式固件的后模糊测试分析,并实现高效的基于事件的故障定位

基本信息 原文标题&#xff1a;FIRMRCA: Towards Post-Fuzzing Analysis on ARM Embedded Firmware with Efficient Event-based Fault Localization 原文作者&#xff1a;Boyu Chang, Binbin Zhao, Qiao Zhang, Peiyu Liu, Yuan Tian, Raheem Beyah, Shouling Ji 作者单位&…