Java中常见的设计模式及应用场景

Java中常见的设计模式及应用场景

大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨Java中常见的设计模式及其应用场景,帮助大家更好地理解和应用这些设计模式,提高代码的可维护性和可扩展性。

设计模式概述

设计模式是一种被反复使用的、经过分类的、代码设计中被广泛认可的优秀代码设计经验。它不仅能解决常见的问题,还能提升代码的可读性和灵活性。设计模式主要分为三大类:创建型模式、结构型模式和行为型模式。

创建型模式

创建型模式关注对象的创建过程,主要有单例模式、工厂模式、抽象工厂模式、建造者模式和原型模式。

单例模式

单例模式确保一个类只有一个实例,并提供一个全局访问点。

示例:单例模式
package cn.juwatech;public class Singleton {private static Singleton instance;private Singleton() {// 私有构造函数,防止外部实例化}public static synchronized Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}

在这个示例中,Singleton类的构造函数是私有的,并且通过getInstance方法确保只有一个实例存在。使用synchronized关键字保证线程安全。

工厂模式

工厂模式定义一个创建对象的接口,但由子类决定实例化哪个类。

示例:工厂模式
package cn.juwatech;interface Product {void use();
}class ConcreteProductA implements Product {public void use() {System.out.println("使用产品A");}
}class ConcreteProductB implements Product {public void use() {System.out.println("使用产品B");}
}class ProductFactory {public static Product createProduct(String type) {if (type.equals("A")) {return new ConcreteProductA();} else if (type.equals("B")) {return new ConcreteProductB();}return null;}
}public class FactoryPatternDemo {public static void main(String[] args) {Product productA = ProductFactory.createProduct("A");productA.use();Product productB = ProductFactory.createProduct("B");productB.use();}
}

在这个示例中,ProductFactory通过传入的类型参数创建不同的产品对象,客户端代码不需要知道具体的创建细节。

结构型模式

结构型模式关注类和对象的组合,主要有适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式和享元模式。

适配器模式

适配器模式将一个类的接口转换成客户希望的另一个接口,使得原本不兼容的类可以一起工作。

示例:适配器模式
package cn.juwatech;interface Target {void request();
}class Adaptee {public void specificRequest() {System.out.println("特殊请求");}
}class Adapter implements Target {private Adaptee adaptee;public Adapter(Adaptee adaptee) {this.adaptee = adaptee;}@Overridepublic void request() {adaptee.specificRequest();}
}public class AdapterPatternDemo {public static void main(String[] args) {Adaptee adaptee = new Adaptee();Target target = new Adapter(adaptee);target.request();}
}

在这个示例中,Adapter类将Adaptee类的接口转换为Target接口,使得Adaptee类可以与客户端代码兼容。

装饰器模式

装饰器模式动态地给对象添加一些额外的职责,就增加功能来说,装饰器模式比生成子类更为灵活。

示例:装饰器模式
package cn.juwatech;interface Component {void operation();
}class ConcreteComponent implements Component {public void operation() {System.out.println("基本操作");}
}class Decorator implements Component {protected Component component;public Decorator(Component component) {this.component = component;}public void operation() {component.operation();}
}class ConcreteDecoratorA extends Decorator {public ConcreteDecoratorA(Component component) {super(component);}public void operation() {super.operation();addedBehavior();}private void addedBehavior() {System.out.println("附加操作A");}
}class ConcreteDecoratorB extends Decorator {public ConcreteDecoratorB(Component component) {super(component);}public void operation() {super.operation();addedBehavior();}private void addedBehavior() {System.out.println("附加操作B");}
}public class DecoratorPatternDemo {public static void main(String[] args) {Component component = new ConcreteComponent();Component decoratorA = new ConcreteDecoratorA(component);Component decoratorB = new ConcreteDecoratorB(component);decoratorA.operation();decoratorB.operation();}
}

在这个示例中,ConcreteDecoratorA和ConcreteDecoratorB通过装饰模式动态地给ConcreteComponent对象添加了新的行为。

行为型模式

行为型模式关注对象之间的通信和职责分配,主要有观察者模式、策略模式、命令模式、责任链模式、中介者模式、备忘录模式、迭代器模式、模板方法模式和状态模式。

观察者模式

观察者模式定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。

示例:观察者模式
package cn.juwatech;import java.util.ArrayList;
import java.util.List;interface Observer {void update(String message);
}class ConcreteObserver implements Observer {private String name;public ConcreteObserver(String name) {this.name = name;}@Overridepublic void update(String message) {System.out.println(name + " 收到消息: " + message);}
}class Subject {private List<Observer> observers = new ArrayList<>();public void attach(Observer observer) {observers.add(observer);}public void detach(Observer observer) {observers.remove(observer);}public void notifyObservers(String message) {for (Observer observer : observers) {observer.update(message);}}
}public class ObserverPatternDemo {public static void main(String[] args) {Subject subject = new Subject();Observer observer1 = new ConcreteObserver("观察者1");Observer observer2 = new ConcreteObserver("观察者2");subject.attach(observer1);subject.attach(observer2);subject.notifyObservers("新的消息来了!");}
}

在这个示例中,Subject类维护了一组观察者对象,当状态发生变化时,通知所有观察者进行更新。

总结

通过本文,我们详细介绍了Java中常见的设计模式及其应用场景,包括创建型模式、结构型模式和行为型模式。每种模式都有其独特的应用场景和优势,合理使用这些设计模式,可以提高代码的可维护性、可扩展性和灵活性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/32819.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java中如何处理日期和时间?

Java中如何处理日期和时间&#xff1f; 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨如何在Java中处理日期和时间&#xff0c;这是开发中非常常…

数组元素去重

1 .旧数组不重复的元素放到新数组 2 .遍历旧数组&#xff0c;拿旧数组查新数组&#xff0c;如果元素在新数组内没有出现过就添加 3 .利用 新数组.indexOf(数组元素) 如果返回-1就说明新数组里没有该元素 //封装一个 去重的函数 function unique(arr) {var newArr[];for(var …

高通安卓12-固件升级

下载步骤 第一步 格式化 「下载一次即可&#xff1b;能开机能下载的板子 忽略这一步&#xff0c;直接执行第二步即可」 QFIL工具配置为UFS类型&#xff0c;勾选Provision&#xff0c;如下图&#xff1a; Programmer选择prog_firehose_ddr.elf&#xff0c;Provision Xml选择prov…

Springboot项目jar加密

部署的程序进行加密&#xff0c;防止第三方非法拷贝走项目进行二次开发或部署。我们知道java代码编译后生成的以.class结尾的字节码文件或者.jar/.war结尾的可执行文件都是可以反编译生成.java文件的&#xff0c;虽然反编译后生成的.java文件和原本的.java文件有些微差别&#…

【STM32-新建工程-CubeMX】

STM32-新建工程-CubeMX ■ CubeMX 生产工程 ■ CubeMX 生产工程

QT事件处理系统之五:自定义事件的发送案例 sendEvent和postEvent接口

1、案例 双击窗口,会发送 自定义事件,然后在事件过滤中心进行拦截处理自定义事件。 2、核心代码 /*解释:双击窗口时,将产生双击事件,然后该事件被包裹成一个对象,随后将会被发往event事件中心,然后进行事件的处理(Widget对象);因为m_lineEdit开启了事件过滤机制,所…

在前端项目中,如何处理错误和异常?

在前端项目中&#xff0c;如何处理错误和异常&#xff1f; 在前端项目中&#xff0c;处理错误和异常是至关重要的&#xff0c;它能确保应用程序的稳定性和用户体验。以下是一些常见的方法&#xff1a; try-catch-finally结构&#xff1a;使用JavaScript的try/catch块来捕获并…

如何使用Dockerfile创建容器映像

如何使用Dockerfile创建容器映像 Dockerfile是一个基于文本的文档&#xff0c;用于创建容器映像。它为映像构建器提供有关要运行的命令、要复制的文件、启动命令等的说明。在这篇博客中&#xff0c;我们将介绍如何编写一个Dockerfile来生成一个可立即运行的应用程序容器映像。…

MQTT协议与TCP/IP协议在性能上的区别

MQTT协议与TCP/IP协议在性能上的区别主要体现在以下几个方面&#xff1a; 1.协议开销与传输效率&#xff1a; ① MQTT&#xff1a;MQTT协议针对消息传递进行了优化&#xff0c;使用了小型的控制包和变长的包头设计&#xff0c;极大程度地减少了数据传输过程中的冗余和带宽消耗…

一定要注意空调孔,不仅会进风还会进雨

有位业主给我说&#xff0c;感觉家里边老是有风&#xff0c;感觉家里的温度也不高&#xff0c;也找不到从哪进的&#xff0c;帮忙去给看看。      和业主约了个时间&#xff0c;然后就一块去房子里面看一下。      这套房子已经装修好两年了&#xff0c;业主的父母已经…

2024.6.23 刷题总结

2024.6.23 **每日一题** 520.检测大写字母&#xff0c;本题是简单模拟题&#xff0c;考察了ASCLL码相关的知识&#xff0c;根据题意&#xff0c;本题对于字符串有三种正确的用法&#xff0c;所以我们分三类来讨论&#xff0c;先根据首字母的大小写来分类&#xff0c;如果首字母…

Linux - 利用/proc/sys/vm/drop_caches实现手工清理系统缓存

文章目录 现象buff/cache 的作用和含义分析 buff/cache 占用大量内存的原因是否需要清理缓存及其方法 命令清理缓存方法1. sync 命令2. echo 3>/proc/sys/vm/drop_caches 命令 注意事项小结 现象 使用free 命令&#xff0c;看到 buff/cache 占用很多 。 free 命令用于显示系…

第一个Flask程序

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 一切准备就绪&#xff0c;现在我们开始编写第一个Flask程序&#xff0c;由于是第一个Flask程序&#xff0c;当然要从最简单的“Hello World&#xff…

GPT-5大幅推迟?OpenAI CTO称将在2025年底到2026年初推出

GPT-5大幅推迟&#xff1f;OpenAI CTO称将在2025年底到2026年初推出 OpenAI CTO同时透露&#xff0c;GPT-5性能将有巨大飞跃&#xff0c;在某些特定任务中达到“博士水平”智能&#xff0c;此前市场曾预测GPT-5可能在2023年底或2024年夏季发布。 一再跳票的GPT-5可能大幅推迟…

docker 删除本地镜像释放磁盘空间

时间一长&#xff0c;本地镜像文件特别多&#xff1a; 1 linux 配置crontab 定期删除 crontab l 查看 crontab e 编辑 30 3 * * * /home/mqq/gengmingming/cleanImage-realize.sh > /home/mqq/gengmingming/cleanImage-realize.log 2>&12 cleanImage-realize.sh …

展锐T820平台Android11开发:kernel设备树编译问题

一.kernel多board自适应 展锐平台的kernel具有多board自适应功能&#xff0c;即相同体系架构的两个不同的board间&#xff0c;boot.img、socko.img/odmko(vendorboot.img)、dtbo.img是可替换的&#xff0c;这些镜像文件称为R-img&#xff08;Replaceable images&#xff0c;可替…

JetBrains IDEA 新旧UI切换

JetBrains IDE 新旧UI切换 IntelliJ IDEA 的老 UI 以其经典的布局和稳定的性能&#xff0c;成为了许多开发者的首选。而新 UI 则在此基础上进行了全面的改进&#xff0c;带来了更加现代化、响应式和高效的用户体验。无论是新用户还是老用户&#xff0c;都可以通过了解和适应这…

101.qt qml-自定义日历控件2-附带动画效果

黑色风格截图如下所示: 白色风格如下所示: GIF效果如下所示: 1.控件使用介绍 QianWindow2.5版本及以上提供,源码位于:qrc:/common/qmlQianDateTime/QianCalendarInputField.qml QianWindow2.5版本及以上提供,示例使用代码位于:qrc:/pages/QianControlPages/QianDateTimeP…

华为OD机试C卷(100分)-最大N个数与最小N个数的和(C语言)

题目描述 给定一个数组&#xff0c;编写一个函数来计算它的最大N个数与最小N个数的和。你需要对数组进行去重。 说明&#xff1a; 数组中数字范围[0, 1000] 最大N个数与最小N个数不能有重叠&#xff0c;如有重叠&#xff0c;输入非法返回-1 输入非法返回-1 输入描述 第一行输…

修复:cannot execute binary file --- ppc64le 系统架构

前言&#xff1a; 修复node_exporter,引用pprof包&#xff0c;对源码编译后在 Linux 系统下执行程序运行时&#xff0c;发生了报错&#xff0c;报错信息&#xff1a;cannot execute binary file: Exec format error。 开始以为编译有问题&#xff0c;检查发现&#xff1b;该l…