探索Java中的设计模式:原则与实例
探索Java中的设计模式:原则与实例
大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天,我们将深入探讨Java中的设计模式,包括一些关键的设计原则和具体的实例。设计模式是软件工程中的重要组成部分,它们提供了一套经过验证的解决方案来应对常见的设计问题。
一、设计模式的基本原则
-
单一职责原则(SRP)
一个类应该只有一个原因引起它的变化。简单来说,就是每个类应该有且仅有一个责任。
-
开放-关闭原则(OCP)
软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。换句话说,应该通过扩展来增加功能,而不是修改已有代码。
-
里氏替换原则(LSP)
子类对象应该能够替换掉所有父类对象,并且程序的行为不会改变。这确保了继承的正确性。
-
接口隔离原则(ISP)
一个类对另一个类的依赖应当建立在最小的接口上。即一个接口应该尽量小,避免创建过多的方法。
-
依赖倒置原则(DIP)
高层模块不应该依赖低层模块,二者都应该依赖抽象;抽象不应该依赖细节,细节应该依赖抽象。
二、常见设计模式及其Java实现
-
单例模式(Singleton Pattern)
单例模式确保一个类只有一个实例,并提供一个全局访问点。它常用于需要全局共享的资源,如配置管理器。
package cn.juwatech.singleton;public class Singleton {private static Singleton instance;private Singleton() {// 私有构造函数防止外部实例化}public static synchronized Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;} }该实现使用了双重检查锁定,以减少同步开销。
-
工厂模式(Factory Pattern)
工厂模式提供了一个创建对象的接口,但由子类决定实例化哪一个类。它用于创建复杂对象。
package cn.juwatech.factory;// 产品接口 interface Product {void use(); }// 具体产品 class ConcreteProductA implements Product {@Overridepublic void use() {System.out.println("Using Product A");} }class ConcreteProductB implements Product {@Overridepublic void use() {System.out.println("Using Product B");} }// 工厂类 public class ProductFactory {public static Product createProduct(String type) {switch (type) {case "A":return new ConcreteProductA();case "B":return new ConcreteProductB();default:throw new IllegalArgumentException("Unknown product type");}} }客户端代码使用
ProductFactory来创建具体的产品实例,而无需知道具体的实现类。 -
观察者模式(Observer Pattern)
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象。当主题对象发生改变时,所有依赖于它的观察者都会收到通知。
package cn.juwatech.observer;import java.util.ArrayList; import java.util.List;// 主题接口 interface Subject {void addObserver(Observer observer);void removeObserver(Observer observer);void notifyObservers(); }// 观察者接口 interface Observer {void update(String message); }// 具体主题 class ConcreteSubject implements Subject {private final List<Observer> observers = new ArrayList<>();private String state;@Overridepublic void addObserver(Observer observer) {observers.add(observer);}@Overridepublic void removeObserver(Observer observer) {observers.remove(observer);}@Overridepublic void notifyObservers() {for (Observer observer : observers) {observer.update(state);}}public void setState(String state) {this.state = state;notifyObservers();} }// 具体观察者 class ConcreteObserver implements Observer {private final String name;public ConcreteObserver(String name) {this.name = name;}@Overridepublic void update(String message) {System.out.println(name + " received message: " + message);} }// 测试观察者模式 public class ObserverExample {public static void main(String[] args) {ConcreteSubject subject = new ConcreteSubject();Observer observer1 = new ConcreteObserver("Observer 1");Observer observer2 = new ConcreteObserver("Observer 2");subject.addObserver(observer1);subject.addObserver(observer2);subject.setState("New State");} }以上代码展示了如何使用观察者模式来实现主题和观察者之间的通知机制。
-
策略模式(Strategy Pattern)
策略模式定义了一系列算法,并将每一个算法封装起来,让它们可以互相替换,策略模式使得算法可以独立于使用它的客户而变化。
package cn.juwatech.strategy;// 策略接口 interface Strategy {int execute(int a, int b); }// 具体策略 class AddStrategy implements Strategy {@Overridepublic int execute(int a, int b) {return a + b;} }class SubtractStrategy implements Strategy {@Overridepublic int execute(int a, int b) {return a - b;} }// 上下文 public class Context {private final Strategy strategy;public Context(Strategy strategy) {this.strategy = strategy;}public int executeStrategy(int a, int b) {return strategy.execute(a, b);} }// 测试策略模式 public class StrategyExample {public static void main(String[] args) {Context context = new Context(new AddStrategy());System.out.println("Add: " + context.executeStrategy(5, 3));context = new Context(new SubtractStrategy());System.out.println("Subtract: " + context.executeStrategy(5, 3));} }在这段代码中,
Context类使用不同的策略对象来执行算法,而无需知道具体的实现细节。
总结
设计模式提供了一种高效的解决方案来应对常见的软件设计问题。在Java中,设计模式不仅可以提升代码的可读性和可维护性,还能够帮助开发者构建更加灵活和可扩展的系统。通过掌握设计模式及其原则,能够在实际开发中更加得心应手,编写出高质量的代码。
本文著作权归聚娃科技微赚淘客系统开发者团队,转载请注明出处!
相关文章:
探索Java中的设计模式:原则与实例
探索Java中的设计模式:原则与实例 大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!今天,我们将深入探讨Java中的设计模式,包括一些关键的设计原则和具体的实例。设计…...
【Java】关键字-static【主线学习笔记】
文章目录 前言关键字:static静态变量静态方法设置为静态的场景 下一篇 前言 Java是一门功能强大且广泛应用的编程语言,具有跨平台性和高效的执行速度,广受开发者喜爱。在接下来的学习过程中,我将记录学习过程中的基础语法、框架和…...
数字自然资源领域的实现路径
在数字化浪潮的推动下,自然资源的管理与利用正经历着前所未有的变革。本文将从测绘地理信息与遥感专业的角度,深度分析数字自然资源领域的实现路径。 1. 基础数据的数字化 数字自然资源的构建,首先需要实现基础数据的数字化。这包括地形地貌…...
GitLab邮箱发送邮件:如何实现自动化发信?
gitlab邮箱发送邮件设置教程?Gitlab邮箱配置和使用? GitLab不仅提供了代码版本控制、持续集成/持续部署等功能,还支持通过其内置的邮件功能实现自动化邮件发送。AokSend将深入探讨如何在GitLab中配置和使用邮箱发送邮件功能。 GitLab邮箱发…...
sqli-labs靶场搭建
下载了一个phpstudy进行搭靶场搭建 然后打开phpstudy安装好php,mysql等环境 正式sqli-labs靶场搭建 第一步:下载源码:https://codeload.github.com/Audi-1/sqli-labs/zip/master 解压后放进网站根目录,进到 sqli-labs的文件夹下࿰…...
Leetcode Hot 100刷题记录 -Day14(矩阵置0)
矩阵置0 问题描述: 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0。 示例 1: 输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]]示例 2:…...
每日刷题(算法)
我们N个真是太厉害了 思路: 我们先给数组排序,如果最小的元素不为1,那么肯定是吹牛的,我们拿一个变量记录前缀和,如果当前元素大于它前面所有元素的和1,那么sum1是不能到达的值。 代码: #def…...
大牛直播SDK核心音视频模块探究
技术背景 视沃科技旗下”大牛直播SDK”,始于2015年,致力于传统行业极致体验的音视频直播技术解决方案,产品涵盖跨平台的实时RTMP推流、RTMP/RTSP直播播放(支持RTSP|RTMP H.265,Enhanced RTMP H.265)、GB28181设备接入、推送端播放…...
gin配置swagger文档
一、基本准备工作 1、安装依赖包 go get -u github.com/swaggo/swag/cmd/swag go get -u github.com/swaggo/gin-swagger go get -u github.com/swaggo/files2、在根目录上配置swagger的路由文件 //2.初始化路由router : initialize.Routers()// 配置swaggerdocs.SwaggerInfo…...
基于ssm的快餐店点餐系统设计与实现
需要项目源码请联系我,目前有各类成品 毕设 javaweb ssh ssm springboot等等项目框架,源码丰富。 专业团队,咨询就送开题报告,活动限时免费,有需要的朋友可以来留言咨询。 一、摘要 进入二十一世纪以来,计…...
集合框架底层使用了什么数据结构
1.是什么 集合框架(Collection Framework)是Java标准库的一部分,它提供了一系列接口和实现类,用于处理不同类型的集合。这些集合可以用于存储和操作对象,如列表、集合、映射等。集合框架的底层数据结构是多种多样的&am…...
Activiti7《第二式:破剑式》——工作流中的以柔克刚
冲冲冲!开干 这篇文章将分为九个篇章,带你逐步掌握工作流的核心知识。这篇文章将带你深入探讨工作流中的 “破剑式”,揭示如何通过 柔与刚 的结合来破解工作流的复杂性。本篇包含了 Activiti7 环境的进一步优化和表结构的深入分析࿰…...
docker快速搭建kafka
1、拉取镜像 kafka和 zk镜像 docker pull wurstmeister/zookeeper docker pull wurstmeister/kafka:1.1.02、运行zk容器 docker run -itd --restart always --name zookeeper -p 2181:2181 wurstmeister/zookeeper3、运行kafka容器 192.168.31.112 这个地址为zk地址 docker…...
基于 onsemi NCV78343 NCV78964的汽车矩阵式大灯方案
一、方案描述 大联大世平集团针对汽车矩阵大灯,推出 基于 onsemi NCV78343 & NCV78964的汽车矩阵式大灯方案。 开发板搭载的主要器件有 onsemi 的 Matrix Controller NCV78343、LED Driver NCV78964、Motor Driver NCV70517、以及 NXP 的 MCU S32K344。 二、开…...
OpenAl o1论文:Let’s Verify Step by Step 快速解读
OpenAl又火了,这次是o1又带给大家惊艳。网上的博主已经有了真真假假的各种评测,我这篇来一点硬核的,解读OpenAl o1背后的论文:Let’s Verify Step by Step 大模型在给定的上下文资料正确的情况下也有可能出现幻觉,这篇…...
Errorresponsefromdaemon:toomanyrequests:Youhavereachedyourpullratelimit.
Errorresponsefromdaemon:toomanyrequests:Youhavereachedyourpullratelimit.Youmayincreasethelimitbyauthenticatingandupgrading:https://www.docker.com/increase−rate−limit.See ′ dockerrun−−help 在拉取docker进行的时候遇到这个问题,如何解决呢?本文提供的解决方…...
[2025]医院健康陪诊系统(源码+定制+服务)
博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…...
Golang | Leetcode Golang题解之第405题数字转换为十六进制数
题目: 题解: func toHex(num int) string {if num 0 {return "0"}sb : &strings.Builder{}for i : 7; i > 0; i-- {val : num >> (4 * i) & 0xfif val > 0 || sb.Len() > 0 {var digit byteif val < 10 {digit 0…...
VB中如何使用正则表达式(Regular Expressions)
在Visual Basic (VB) 中使用正则表达式,你需要依赖于.NET Framework的System.Text.RegularExpressions命名空间。这个命名空间提供了一系列的类,其中最常用的是Regex类,它允许你在VB.NET中执行复杂的文本搜索和替换操作。 以下是如何在VB.NE…...
Docker FROM 指定基础镜像
所谓定制镜像,其一定是以一个镜像为基础,在其上进行定制。 比如一个 nginx 镜像的容器,再进行修改一样,基础镜像是必须指定的。而 FROM 就是指定基础镜像,因此一个 Dockerfile 中 FROM 是必备的指令,并且必…...
Stegsnow使用教程
Stegsnow是一款轻量级的隐写术工具,专门用于在文本文件中隐藏秘密信息。其核心原理是利用文本文件中的”空白字符”(如空格、制表符、换行符)存储二进制数据,通过调整这些不可见字符的组合来编码秘密信息,从而实现隐蔽…...
写程序茶叶/咖啡包装日期密封标,易撕不损盒,输出:小众商家定制包装,提升质感。
项目方案:基于Python的激光易撕密封标牌生成系统一、 实际应用场景描述想象一下,你走进一家主打手冲咖啡或高端岩茶的精品买手店。他们售卖的是50g 装的挂耳咖啡包或散装岩茶罐。传统的解决方案是贴一张简陋的不干胶标签,写上日期,…...
基于S7-200控制的全方位自动洗车系统设计与实现:包含设计手册、PLC程序、仿真与实际接线全图解
基于S7-200控制的自动洗车系统设计 本设计包括设计说明书,PLC程序,组态仿真,I/O接口,带注释程序pdf版,接线图,控制电路图,主电路图,PLC接线图,顺序功能图。 总体设计系统…...
Python爬虫实战:用Qwen2.5-VL智能解析网页图片内容
Python爬虫实战:用Qwen2.5-VL智能解析网页图片内容 1. 引言 你有没有遇到过这样的情况:爬取了大量网页图片,却要人工一张张查看内容?或者需要从海量图片中筛选出特定类型的商品、识别图中的文字信息?传统爬虫只能获取…...
SEO原创文章的发布频率应该如何确定
SEO原创文章的发布频率应该如何确定 在当今的互联网时代,搜索引擎优化(SEO)已经成为网站运营的关键环节之一。为了在百度上获得更好的排名,发布高质量的原创文章是必不可少的策略。如何确定SEO原创文章的发布频率,是许…...
JavaScript typeof 操作符详解
JavaScript typeof 操作符详解 引言 在JavaScript中,typeof 是一个一元运算符,用于检测给定变量的数据类型。它是JavaScript中最常用的类型检测方法之一。本文将详细介绍 typeof 操作符的用法、返回值以及注意事项。 typeof 运算符概述 typeof 运算符可以用于检测任何Jav…...
QT界面设计小技巧:用QListWidget+CheckBox打造可交互列表(避坑指南)
QT界面设计实战:QListWidget与CheckBox的高效交互方案 在桌面应用开发中,列表控件与复选框的组合堪称经典交互模式。这种设计不仅直观地呈现多项选择场景,还能有效提升用户操作效率。作为QT框架中的核心组件,QListWidget与QCheckB…...
OpenClaw故障模拟:gemma-3-12b-it在断网环境下的降级处理方案
OpenClaw故障模拟:gemma-3-12b-it在断网环境下的降级处理方案 1. 为什么需要关注断网场景下的容灾设计 上周我在调试一个基于OpenClaw的自动化日报生成系统时,遇到了一个意外情况:网络突然中断导致整个流程卡死。这让我意识到,在…...
去中心化 AI Agent Harness Engineering 网络与区块链的结合
去中心化 AI Agent Harness Engineering 网络与区块链的结合 1. 引入与连接:开启智能协作新纪元 1.1 一场即将到来的变革 想象一下,在不远的将来,我们的数字世界不再由少数几家科技巨头主导,而是由无数自主运作的智能体组成的生态系统。这些智能体可以自主决策、协作完成…...
免费商用AI绘画:Bidili Generator基于SDXL,LoRA风格一键切换
免费商用AI绘画:Bidili Generator基于SDXL,LoRA风格一键切换 1. 项目概述:当SDXL遇上Bidili风格 在AI绘画领域,Stable Diffusion XL(SDXL)1.0已经成为开源图像生成的标杆模型。而Bidili Generator正是在这…...
