请解释Java中的设计模式,并举例说明一个常用的设计模式

请解释Java中的设计模式,并举例说明一个常用的设计模式

在Java中,设计模式是一种被广泛采用的解决特定问题的可复用方案。设计模式提供了一套经过验证的解决方案,可以帮助开发人员解决常见的软件设计问题,提高代码的可维护性、可扩展性和重用性。

常用的设计模式包括创建型模式、结构型模式和行为型模式。

创建型模式(Creational Patterns):
这些设计模式关注对象的创建过程,帮助解决对象的实例化问题。

工厂方法模式(Factory Method Pattern):
定义一个用于创建对象的接口,但是将具体创建工作延迟到子类中进行。
示例:java.util.Calendar#getInstance()。
结构型模式(Structural Patterns):
这些设计模式关注对象的组合,帮助解决对象之间的组合关系。

适配器模式(Adapter Pattern):
将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
示例:java.util.Arrays#asList() 将数组转换为列表。
行为型模式(Behavioral Patterns):
这些设计模式关注对象之间的通信和职责分配,帮助解决对象之间的交互问题。

观察者模式(Observer Pattern):
定义对象之间的一对多依赖关系,使得当一个对象状态发生改变时,所有依赖它的对象都会得到通知并自动更新。
示例:java.util.Observer 和 java.util.Observable。
这只是其中一个常见的设计模式示例。设计模式并不是一成不变的,它们可以根据实际场景进行调整和扩展。使用设计模式有助于提高代码的可读性、可维护性和重用性,并且有助于保持代码的灵活性和可扩展性。
让我们对观察者模式进行更详细的解释,并提供一个示例说明其在Java中的应用。

观察者模式(Observer Pattern):
观察者模式是一种行为型设计模式,它定义了对象之间的一种一对多的依赖关系,使得当一个对象的状态发生改变时,其所有依赖对象都会得到通知并自动更新。

结构:
主题(Subject):

也称为被观察者(Observable),它维护一组观察者对象,并提供方法来添加、删除和通知观察者。
观察者(Observer):

它定义了一个更新接口,用于接收和处理主题状态的变化。
示例场景:
假设我们有一个名为WeatherStation的气象站,它负责采集天气信息,并在气象数据发生变化时通知观察者。

Java中的应用示例:

import java.util.ArrayList;
import java.util.List;// 主题:气象站
class WeatherStation {private List<Observer> observers = new ArrayList<>();private int temperature;public void addObserver(Observer observer) {observers.add(observer);}public void removeObserver(Observer observer) {observers.remove(observer);}public void setTemperature(int temperature) {this.temperature = temperature;notifyObservers();}private void notifyObservers() {for (Observer observer : observers) {observer.update(temperature);}}
}// 观察者接口
interface Observer {void update(int temperature);
}// 具体观察者:显示当前温度
class CurrentTemperatureDisplay implements Observer {@Overridepublic void update(int temperature) {System.out.println("当前温度:" + temperature);}
}// 具体观察者:显示预警信息
class WeatherAlertDisplay implements Observer {@Overridepublic void update(int temperature) {if (temperature > 30) {System.out.println("温度过高,请注意防暑!");}}
}// 测试
public class ObserverPatternExample {public static void main(String[] args) {WeatherStation weatherStation = new WeatherStation();CurrentTemperatureDisplay currentDisplay = new CurrentTemperatureDisplay();WeatherAlertDisplay alertDisplay = new WeatherAlertDisplay();weatherStation.addObserver(currentDisplay);weatherStation.addObserver(alertDisplay);// 模拟温度变化,通知观察者weatherStation.setTemperature(25); // 当前温度:25weatherStation.setTemperature(35); // 当前温度:35;温度过高,请注意防暑!}
}

在这个示例中,WeatherStation是主题,它负责管理观察者(Observer),并在温度发生变化时通知观察者。CurrentTemperatureDisplay和WeatherAlertDisplay是具体观察者,它们分别显示当前温度和发出预警信息。通过观察者模式,我们可以轻松地实现对象之间的解耦,并在状态变化时及时通知观察者。

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

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

相关文章

2 月 7 日算法练习- 数据结构-树状数组

树状数组 lowbit 在学习树状数组之前&#xff0c;我们需要了解lowbit操作&#xff0c;这是一种位运算操作&#xff0c;用于计算出数字的二进制表达中的最低位的1以及后面所有的0。 写法很简单&#xff1a; int lowbit&#xff08;int x&#xff09;&#xff5b;return x &am…

51单片机精进之路-1点亮led灯

本例中led灯使用共阳极连接在电路中&#xff0c;共阳极即将led的正极接在一起&#xff0c;通过上拉电阻接到电源正极&#xff0c;通过单片机io与Led的负极相连&#xff0c;io输出低电平&#xff0c;有电流从led流过&#xff0c;此时led点亮&#xff0c;当io输出高电平时&#x…

leetcode-206-翻转链表

对于链表来说&#xff0c;->next就是代表图上的那个箭头&#xff0c;指向后&#xff0c;就相当于已经建立完链接&#xff0c;就可以改变只想节点的指针的位置了 每一个指针&#xff0c;则是代表一个圈 一 解题 方法一&#xff1a;迭代 假设链表为 1→2→3→∅1 \rightar…

2024.02.08

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget) {ui->setupUi(this);this->setWindowIcon(QIcon(":/zh.png"));ui->lineEdit->setPlaceholderText("账号/手…

VSCode 文件夹增加右键打开

按照以下步骤操作即可 按下Win R组合键输入"regedit"并按回车&#xff0c;打开注册表编辑器。在注册表编辑器的左侧找到&#xff1a;计算机\HKEY_CLASSES_ROOT\Directory\shell这个路径&#xff0c;在shell下右键新建>项&#xff0c;将其命名为"VSCode&quo…

WordPress Plugin HTML5 Video Player SQL注入漏洞复现(CVE-2024-1061)

0x01 产品简介 WordPress和WordPress plugin都是WordPress基金会的产品。WordPress是一套使用PHP语言开发的博客平台。该平台支持在PHP和MySQL的服务器上架设个人博客网站。WordPress plugin是一个应用插件。 0x02 漏洞概述 WordPress Plugin HTML5 Video Player 插件 get_v…

Python进阶--爬取美女图片壁纸(基于回车桌面网的爬虫程序)

目录 一、前言 二、爬取下载美女图片 1、抓包分析 a、分析页面 b、明确需求 c、抓包搜寻 d、总结特点 2、编写爬虫代码 a、获取图片页网页源代码 b、提取所有图片的链接和标题 c、下载并保存这组图片 d、 爬取目录页的各种类型美女图片的链接 e、实现翻页 三、各…

ZooKeeper安装及配置(Windows版)

步骤&#xff1a; 1.官网下载二进制版本ZooKeeper安装包。 2.解压到你要安装的目录下 3.配置 3.1进入目录 D:\Install\apache-zookeeper-3.9.1-bin 新增两个文件夹&#xff1a;data和log 3.2 进入目录D:\Install\apache-zookeeper-3.9.1-bin\conf 复制zoo_sample.cfg文件&a…

可选链语法?.

可选链运算符&#xff08;?.&#xff09;允许读取位于连接对象链深处的属性的值&#xff0c;而不必明确验证链中的每个引用是否有效。?. 运算符的功能类似于 . 链式运算符&#xff0c;不同之处在于&#xff0c;在引用为空 (nullish ) (null 或者 undefined) 的情况下不会引起…

手把手教你开发Python桌面应用-PyQt6图书管理系统-主窗体点击菜单显示功能窗体实现

锋哥原创的PyQt6图书管理系统视频教程&#xff1a; PyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~_哔哩哔哩_bilibiliPyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~共计24条视频&…

【人工智能】人工智能 – 引领未来科技的潮流

写在前面 引言红利挑战结论 引言 人工智能是指使计算机系统表现出类似于人类智能的能力。其目标是实现机器具备感知、理解、学习、推理和决策等智能行为。人工智能的发展可以追溯到上世纪50年代&#xff0c;随着计算机技术和算法的不断进步&#xff0c;人工智能得以实现。 今天…

visual studio code could not establish connection to *: XHR failed

vscode远程连接服务器时&#xff0c;输入密码&#xff0c;又重新提示输入密码&#xff0c;就这样循环了好几次&#xff0c;然后会报上述的错误。由于我是window系统&#xff0c;我用cmd&#xff0c;然后ssh */你的IP地址/*发现可以远程到服务器上&#xff0c;但是通过Vscode就不…

向量搜索查询faiss、annoy

首先介绍annoy : 转发空间&#xff1a;https://download.csdn.net/blog/column/10872374/114665212 Annoy是高维空间求近似最近邻的一个开源库。 Annoy构建一棵二叉树&#xff0c;查询时间为O(logn)。 Annoy通过随机挑选两个点&#xff0c;并使用垂直于这个点的等距离超平面…

ROS学习笔记15:动态参数

前言 本人ROS小白&#xff0c;利用寒假时间学习ROS&#xff0c;在此以笔记的方式记录自己每天的学习过程。争取写满20篇(15/20)。 环境&#xff1a;Ubuntu20.04、ROS1&#xff1a;noetic 环境配置&#xff1a;严格按照下方学习链接的教程配置&#xff0c;基本一次成功。 学习链…

CDN缓存404、403状态码

可以参考一下&#xff1a;浏览器缓存和 CDN 在前端的落地 事故记录&#xff1a; 前端发版时存在新旧两个容器&#xff0c;在资源替换的间隙&#xff0c;用户请求到的肯定是新容器的html文件&#xff0c;但是根据新容器的html向新静态资源发起请求&#xff0c;此时旧容器还没有…

新书速览|PyTorch 2.0深度学习从零开始学

实战中文情感分类、拼音汉字转化、中文文本分类、拼音汉字翻译、强化学习、语音唤醒、人脸识别 01 本书简介 本书以通俗易懂的方式介绍PyTorch深度学习基础理论&#xff0c;并以项目实战的形式详细介绍PyTorch框架的使用。为读者揭示PyTorch 2.0进行深度学习项目实战的核心技…

Git介绍和常用命令说明

目录 一、Git概述 1.1 Git是什么 1.2 Git有什么用 1.3 Git仓库介绍 二、Git下载与安装 三、Git代码托管服务&#xff08;远程仓库&#xff09; 四、Git常用命令 4.1 设置用户信息 4.2 获取Git仓库 4.2.1 本地初始化Git仓库 4.2.2 从远程仓库克隆 4.3 本地仓库操作 …

相机图像质量研究(10)常见问题总结:光学结构对成像的影响--光圈

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

SERVLET线程模型

1. SERVLET线程模型 Servlet规范定义了两种线程模型来阐明Web容器应该如何在多线程环境中处理servlet。第一种模型称为多线程模型,默认在此模型内执行所有servlet。在此模型中,每次客户机向servlet发送请求时Web容器都启动一个新线程。这意味着可能有多个线程同时访问servle…

【Transformer-Hugging Face手册 07/10】 微调预训练模型

微调预训练模型 一、说明 使用预训练模型有显着的好处。它可以降低计算成本和碳足迹&#xff0c;并允许您使用最先进的模型&#xff0c;而无需从头开始训练。 &#x1f917; Transformers 提供了针对各种任务的数千个预训练模型的访问权限。当您使用预训练模型时&#xff0c;您…