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

Java中的设计模式:实战案例分享

Java中的设计模式:实战案例分享

大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!

设计模式是软件开发中的宝贵工具,它们为常见的问题提供了经过验证的解决方案,帮助开发者编写出可维护、可扩展的代码。在Java编程中,设计模式更是发挥了重要作用。本文将分享几种常见的Java设计模式,并通过实战案例来展示它们的实际应用。

一、单例模式(Singleton Pattern)

1. 模式简介

单例模式确保一个类只有一个实例,并提供一个全局访问点。它常用于需要全局唯一实例的场景,如配置管理、日志记录等。

2. 实战案例

假设我们需要设计一个日志记录器,确保整个系统中只有一个日志记录器实例。

public class Logger {private static Logger instance;private Logger() {// 私有构造函数}public static Logger getInstance() {if (instance == null) {synchronized (Logger.class) {if (instance == null) {instance = new Logger();}}}return instance;}public void log(String message) {System.out.println(message);}
}public class Main {public static void main(String[] args) {Logger logger = Logger.getInstance();logger.log("This is a log message.");}
}

二、工厂模式(Factory Pattern)

1. 模式简介

工厂模式定义了一个创建对象的接口,但由子类决定实例化哪一个类。它通过延迟到子类来实现实例化,提供了对象创建的灵活性。

2. 实战案例

假设我们需要设计一个形状工厂,根据不同的参数生成不同的形状对象。

// 定义形状接口
interface Shape {void draw();
}// 实现具体的形状类
class Circle implements Shape {public void draw() {System.out.println("Drawing a Circle");}
}class Square implements Shape {public void draw() {System.out.println("Drawing a Square");}
}// 创建形状工厂
class ShapeFactory {public Shape getShape(String shapeType) {if (shapeType == null) {return null;}if (shapeType.equalsIgnoreCase("CIRCLE")) {return new Circle();} else if (shapeType.equalsIgnoreCase("SQUARE")) {return new Square();}return null;}
}// 使用工厂生成对象
public class Main {public static void main(String[] args) {ShapeFactory shapeFactory = new ShapeFactory();Shape shape1 = shapeFactory.getShape("CIRCLE");shape1.draw();Shape shape2 = shapeFactory.getShape("SQUARE");shape2.draw();}
}

三、观察者模式(Observer Pattern)

1. 模式简介

观察者模式定义了对象间的一对多依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都会收到通知并自动更新。该模式常用于事件处理系统中。

2. 实战案例

假设我们设计一个新闻发布系统,当有新新闻发布时,所有订阅者都会收到通知。

import java.util.ArrayList;
import java.util.List;// 定义观察者接口
interface Observer {void update(String message);
}// 实现具体的观察者
class Subscriber implements Observer {private String name;public Subscriber(String name) {this.name = name;}@Overridepublic void update(String message) {System.out.println(name + " received: " + message);}
}// 定义被观察者接口
interface Subject {void attach(Observer observer);void detach(Observer observer);void notifyObservers();
}// 实现具体的被观察者
class NewsPublisher implements Subject {private List<Observer> observers = new ArrayList<>();private String news;public void setNews(String news) {this.news = news;notifyObservers();}@Overridepublic void attach(Observer observer) {observers.add(observer);}@Overridepublic void detach(Observer observer) {observers.remove(observer);}@Overridepublic void notifyObservers() {for (Observer observer : observers) {observer.update(news);}}
}// 使用观察者模式
public class Main {public static void main(String[] args) {NewsPublisher publisher = new NewsPublisher();Subscriber subscriber1 = new Subscriber("Alice");Subscriber subscriber2 = new Subscriber("Bob");publisher.attach(subscriber1);publisher.attach(subscriber2);publisher.setNews("Breaking News: Java Design Patterns are awesome!");publisher.detach(subscriber1);publisher.setNews("Update: Observer Pattern in action!");}
}

四、策略模式(Strategy Pattern)

1. 模式简介

策略模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换。策略模式使得算法可以独立于使用它的客户端变化。

2. 实战案例

假设我们设计一个支付系统,可以根据不同的支付方式(如信用卡、PayPal)来执行支付操作。

// 定义支付策略接口
interface PaymentStrategy {void pay(int amount);
}// 实现具体的支付策略
class CreditCardPayment implements PaymentStrategy {@Overridepublic void pay(int amount) {System.out.println("Paid " + amount + " using Credit Card");}
}class PayPalPayment implements PaymentStrategy {@Overridepublic void pay(int amount) {System.out.println("Paid " + amount + " using PayPal");}
}// 创建上下文使用策略
class ShoppingCart {private PaymentStrategy paymentStrategy;public void setPaymentStrategy(PaymentStrategy paymentStrategy) {this.paymentStrategy = paymentStrategy;}public void checkout(int amount) {paymentStrategy.pay(amount);}
}// 使用策略模式
public class Main {public static void main(String[] args) {ShoppingCart cart = new ShoppingCart();cart.setPaymentStrategy(new CreditCardPayment());cart.checkout(100);cart.setPaymentStrategy(new PayPalPayment());cart.checkout(200);}
}

五、总结

设计模式为软件开发提供了一套最佳实践,帮助开发者编写出高质量、易维护的代码。本文分享了单例模式、工厂模式、观察者模式和策略模式的实战案例,展示了这些模式在实际项目中的应用。掌握并正确应用设计模式,可以大大提高开发效率和代码质量。

感谢大家的阅读,如果您有任何疑问或建议,欢迎留言讨论!

相关文章:

Java中的设计模式:实战案例分享

Java中的设计模式&#xff1a;实战案例分享 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 设计模式是软件开发中的宝贵工具&#xff0c;它们为常见的问题提供…...

并发编程理论基础——合适的线程数量和安全的局部变量(十)

多线程的提升方向 主要方向在于优化算法和将硬件的性能发挥到极致想要发挥出更多的硬件性能&#xff0c;最主要的就是提升I/O的利用率和CPU的利用率以及综合利用率操作系统已经解决了磁盘和网卡的利用率问题&#xff0c;利用中断机制还能避免 CPU 轮询 I/O 状态&#xff0c;也提…...

Python使用抽象工厂模式和策略模式的组合实现生成指定长度的随机数

设计模式选择理由&#xff1a; 抽象工厂模式&#xff1a; 抽象工厂模式适合于创建一组相关或依赖对象的场景。在这里&#xff0c;我们可以定义一个抽象工厂来创建不同类型&#xff08;数字、字母、特殊符号&#xff09;的随机数据生成器。 策略模式&#xff1a; 策略模式允许你…...

python-17-零基础自学python-

学习内容&#xff1a;《python编程&#xff1a;从入门到实践》第二版 知识点&#xff1a; 类、子类、继承、调用函数 练习内容&#xff1a; 练习9-6&#xff1a;冰激凌小店 冰激凌小店是一种特殊的餐馆。编写一个名为IceCreamStand的类&#xff0c;让它继承为完成练习9-1或…...

Web应用和Tomcat的集成鉴权1-BasicAuthentication

作者:私语茶馆 1.Web应用与Tomcat的集成式鉴权 Web应用部署在Tomcat时,一般有三层鉴权: (1)操作系统鉴权 (2)Tomcat容器层鉴权 (3)应用层鉴权 操作系统层鉴权包括但不限于:Tomcat可以和Windows的域鉴权集成,这个适合企业级的统一管理。也可以在Tomcat和应用层独立…...

解决Linux下Java应用因内存不足而崩溃的问题

在Linux系统中运行内存密集型的Java应用时&#xff0c;经常会遇到因系统内存不足而导致应用崩溃的问题。本文将探讨如何诊断这类问题以及提供有效的解决方案。 问题诊断 首先&#xff0c;使用 free -h 命令查看系统的内存使用情况&#xff0c;得到以下输出&#xff1a; total…...

ardupilot开发 --- 视觉伺服 篇

风驰电掣云端飘&#xff0c;相机无法对上焦 1.视觉伺服分类2.视觉伺服中的坐标系3.成像模型推导4.IBVS理论推导5.IBVS面临的挑战6.visp 实践参考文献 1.视觉伺服分类 控制量是在图像空间中推导得到还是在欧式空间中推导得到&#xff0c;视觉伺服又可以分类为基于位置(PBVS)和基…...

KVM配置嵌套虚拟化

按照以下步骤启用、配置和开始使用嵌套虚拟化,默认情况下禁用该功能,要启用它,请在宿主机物理机上进行配置。在centos stream 9和ubuntu 22部署kvm默认支持虚拟机嵌套虚拟化。 1、英特尔 1.1检查嵌套虚拟化在您的主机系统上是否可用 $cat /sys/module/kvm_intel/paramete…...

Springboot应用的信创适配-补充

Springboot应用的信创适配-CSDN博客 因为篇幅限制&#xff0c;这里补全Spring信创适配、数据库信创适配、Redis信创适配、消息队列信创适配等四个章节。 Springboot应用的信创适配 Springboot应用的信创适配&#xff0c;如上图所示需要适配的很多&#xff0c;从硬件、操作系统、…...

制图工具(14)导出图层字段属性信息表

在制图工具&#xff08;13&#xff09;地理数据库初始化工具中我们提到&#xff0c;有一个参数为&#xff1a;“输入Excel表”&#xff0c;并要求表格中的图层字段属性项需要按工具的帮助文档中的示例进行组织… 如下图&#xff1a; 此外&#xff0c;总有那个一个特别的需求&am…...

代码随想录——买股票的最佳时机Ⅱ(Leecode122)

添加链接描述 贪心 局部最优&#xff1a;手机每天的正利润 全局最优&#xff1a;求最大利润 class Solution {public int maxProfit(int[] prices) {int res 0;for(int i 1; i < prices.length; i){res Math.max(prices[i] - prices[i - 1], 0);}return res;} }...

使用Servlet开发javaweb,请求常见错误详解及其解决办法【404、405、500】

Servlet报错的情况多种多样&#xff0c;涵盖了配置错误、代码逻辑错误、资源未找到、权限问题等多个方面。以下是一些常见的Servlet报错情况及其可能的原因和解决方法&#xff1a; 404 Not Found: 错误原因图示&#xff1a; URL映射 发送请求&#xff0c;出现404错误 原因: 请…...

数据库管理-第210期 HaloDB-Oracle兼容性测试02(20240622)

数据库管理210期 2024-06-22 数据库管理-第210期 HaloDB-Oracle兼容性测试02&#xff08;20240622&#xff09;1 表增加列2 约束3 自增列4 虚拟列5 表注释6 truncat表总结 数据库管理-第210期 HaloDB-Oracle兼容性测试02&#xff08;20240622&#xff09; 作者&#xff1a;胖头…...

SpringBoot实现定时任务的动态停止和更新

目录 定时任务管理器定时任务的任务接口定时任务和定时任务结果的缓存对象定时任务使用姿势 定时任务管理器 负责启动一个定时任务、停止一个定时任务、更新一个定时任务 /*** 定时任务管理器* 1、创建并启动一个定时任务* 2、停止一个定时任务* 3、更新一个定时任务*/ publi…...

【threejs】火焰特效制作

2024-06-26 08-57-16火焰 shader 来源 //shadertory&#xff1a;https://www.shadertoy.com/view/ctVGD1//shadertory&#xff1a;https://www.shadertoy.com/view/ml3GWs 代码 import { DoubleSide, ShaderChunk, ShaderMaterial } from "three";export default fu…...

五原则四实践,REST API安全性请谨记

云原生和微服务架构等技术的流行让API受到越来越大的重视。那么当应用程序开始上云&#xff0c;各项需求都可以通过云服务满足的情况下&#xff0c;应用程序&#xff0c;尤其基于云端API的应用程序的安全问题该如何解决&#xff1f; 表现层状态转移&#xff08;REST&#xff0…...

1390:食物链【NOI2001】

【解题思路】 并查集把三类动物划分成三个域&#xff0c;同类域&#xff08;1-n&#xff09;、捕食域〈n1-2n&#xff09;、天敌域&#xff08;2n1-3n&#xff09;。把x放入同类域&#xff0c;xn放入其捕食域&#xff0c;x2n放入其天敌域。给在其他集合内安插两个“虚拟代表”…...

ICMAN液位检测——WS003B管道检测模组

ICMAN液位检测之WS003B管道检测模组 体积小&#xff0c;成本低&#xff0c; 液位检测精度高&#xff0c; 有水输出低电平无水高电平&#xff0c; 适用于饮水机、咖啡机、扫地机器人、洗地机等&#xff0c; 有需要朋友快联系我吧&#xff01; AWE展会不容错过的ICMAN检测模组…...

YOLOv10使用教程及导读

首先推荐一下我的YOLOv8/v10项目&#xff0c;仅需一个v8的钱&#xff08;69.9&#xff09;&#xff0c;付费进群&#xff0c;即可获取v8/v10的全部改进&#xff0c;欢迎进群。 1 YOLOv10简介 论文链接&#xff1a;https://arxiv.org/pdf/2405.14458 官方代码链接&#xff1a;ht…...

AIGC 在前端流式获取内容SSE

AIGC 在前端流式获取内容SSE 简介具体实现 简介 在 OpenAI 的 API 中&#xff0c;SSE 通常用于实现实时数据传输。例如&#xff0c;在聊天模型&#xff08;如 ChatGPT&#xff09;中&#xff0c;使用 SSE 可以让客户端实时接收到生成的对话内容&#xff0c;而不需要等待整个响…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...