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

浅谈Java常见设计模式及实例

前言

Java 中常用的设计模式有很多种,其实平常用到的还比较少,但是还是有必要了解一下,可以按照实际情况运用到我们的代码中。按照类型可以基本分解为,创建型模式、结构型模式和行为型模式。

创建型模式 (Creational Patterns)


1. 工厂方法模式 (Factory Method Pattern):

定义一个创建对象的接口,但是将实际的创建工作交给子类来实现。
考虑一个简单的工厂方法,生产不同类型的形状对象:

  interface Shape {void draw();}class Circle implements Shape {@Overridepublic void draw() {System.out.println("Inside Circle::draw() method.");}}class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("Inside Rectangle::draw() method.");}}class ShapeFactory {public Shape getShape(String shapeType) {if (shapeType == null) {return null;}if (shapeType.equalsIgnoreCase("CIRCLE")) {return new Circle();} else if (shapeType.equalsIgnoreCase("RECTANGLE")) {return new Rectangle();}return null;}}


2. 抽象工厂模式 (Abstract Factory Pattern)

提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
考虑一个抽象工厂,生产不同类型的形状和颜色对象的组合:

   interface Shape {void draw();}interface Color {void fill();}class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("Inside Rectangle::draw() method.");}}class Blue implements Color {@Overridepublic void fill() {System.out.println("Inside Blue::fill() method.");}}abstract class AbstractFactory {abstract Shape getShape(String shapeType);abstract Color getColor(String colorType);}class ShapeFactory extends AbstractFactory {@OverrideShape getShape(String shapeType) {if (shapeType.equalsIgnoreCase("RECTANGLE")) {return new Rectangle();}return null;}@OverrideColor getColor(String colorType) {return null;}}class ColorFactory extends AbstractFactory {@OverrideShape getShape(String shapeType) {return null;}@OverrideColor getColor(String colorType) {if (colorType.equalsIgnoreCase("BLUE")) {return new Blue();}return null;}}

3. 建造者模式 (Builder Pattern)

将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。
考虑一个简单的食物构建器,可以构建汉堡和冷饮:

    class Burger {private String size;private boolean cheese;private boolean pepperoni;private boolean lettuce;public Burger(BurgerBuilder builder) {this.size = builder.size;this.cheese = builder.cheese;this.pepperoni = builder.pepperoni;this.lettuce = builder.lettuce;}static class BurgerBuilder {private String size;private boolean cheese;private boolean pepperoni;private boolean lettuce;public BurgerBuilder(String size) {this.size = size;}public BurgerBuilder cheese(boolean cheese) {this.cheese = cheese;return this;}public BurgerBuilder pepperoni(boolean pepperoni) {this.pepperoni = pepperoni;return this;}public BurgerBuilder lettuce(boolean lettuce) {this.lettuce = lettuce;return this;}public Burger build() {return new Burger(this);}}}


4. 单例模式 (Singleton Pattern)

确保一个类只有一个实例,并提供一个全局访问点。
实现一个线程安全的懒汉式单例:

     public class Singleton {private static Singleton instance;private Singleton() {}public static synchronized Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}}


 

结构型模式 (Structural Patterns)


1.适配器模式 (Adapter Pattern)

将一个类的接口转换成客户端希望的另一个接口。
使用适配器让美国插头可以插入英国插座:

 interface UKPlug {void provideElectricity();}class UKSocket implements UKPlug {@Overridepublic void provideElectricity() {System.out.println("Providing electricity with UK plug.");}}interface USPlug {void supplyElectricity();}class USPlugConnector implements USPlug {@Overridepublic void supplyElectricity() {System.out.println("Supplying electricity with US plug.");}}class USPlugAdapter implements UKPlug {private USPlug plug;public USPlugAdapter(USPlug plug) {this.plug = plug;}@Overridepublic void provideElectricity() {plug.supplyElectricity();}}


2. 桥接模式 (Bridge Pattern)

将抽象部分与它的实现部分分离,使它们可以独立地变化。
将不同颜色的笔与不同类型的绘图设备连接起来:

  interface DrawAPI {void draw();}abstract class Shape {protected DrawAPI drawAPI;protected Shape(DrawAPI drawAPI) {this.drawAPI = drawAPI;}abstract void draw();}class Circle extends Shape {private int x, y, radius;public Circle(int x, int y, int radius, DrawAPI drawAPI) {super(drawAPI);this.x = x;this.y = y;this.radius = radius;}@Overridevoid draw() {drawAPI.draw();}}

3. 组合模式 (Composite Pattern)

将对象组合成树形结构以表示“部分-整体”的层次结构。
用组合模式表示员工的层级结构:

     import java.util.ArrayList;import java.util.List;class Employee {private String name;private String dept;private int salary;private List<Employee> subordinates;public Employee(String name, String dept, int sal) {this.name = name;this.dept = dept;this.salary = sal;subordinates = new ArrayList<Employee>();}public void add(Employee e) {subordinates.add(e);}public void remove(Employee e) {subordinates.remove(e);}public List<Employee> getSubordinates() {return subordinates;}@Overridepublic String toString() {return ("Employee :[ Name : " + name + ", dept : " + dept + ", salary :" + salary + " ]");}}

行为型模式 (Behavioral Patterns)


1. 观察者模式 (Observer Pattern)

定义对象间的一对多依赖关系,当一个对象状态发生改变时,它的所有依赖者都会收到通知并自动更新。
实现一个简单的气象站,当气象数据发生变化时,通知所有注册的观察者:

  import java.util.ArrayList;import java.util.List;interface Observer {void update(float temperature, float humidity, float pressure);}interface Subject {void registerObserver(Observer observer);void removeObserver(Observer observer);void notifyObservers();}class WeatherData implements Subject {private List<Observer> observers;private float temperature;private float humidity;private float pressure;public WeatherData() {observers = new ArrayList<>();}public void registerObserver(Observer observer) {observers.add(observer);}public void removeObserver(Observer observer) {observers.remove(observer);}public void notifyObservers() {for (Observer observer : observers) {observer.update(temperature, humidity, pressure);}}public void measurementsChanged() {notifyObservers();}public void setMeasurements(float temperature, float humidity, float pressure) {this.temperature = temperature;this.humidity = humidity;this.pressure = pressure;measurementsChanged();}}


2. 状态模式 (State Pattern)

允许对象在内部状态改变时改变它的行为。
使用状态模式实现一个简单的电梯控制系统:
 

   interface State {void doAction(Context context);}class Context {private State state;public void setState(State state) {this.state = state;}public State getState() {return state;}}class StartState implements State {public void doAction(Context context) {System.out.println("Player is in start state");context.setState(this);}public String toString() {return "Start State";}}

3. 策略模式 (Strategy Pattern)

定义一系列算法,将每一个算法封装起来,并使它们可以互相替换。
实现一个简单的排序器,可以根据不同的策略选择不同的排序算法:
 

   import java.util.List;interface SortStrategy {<T extends Comparable<T>> void sort(List<T> items);}class BubbleSortStrategy implements SortStrategy {public <T extends Comparable<T>> void sort(List<T> items) {// 实现冒泡排序算法}}class QuickSortStrategy implements SortStrategy {public <T extends Comparable<T>> void sort(List<T> items) {// 实现快速排序算法}}class Sorter {private SortStrategy strategy;public Sorter(SortStrategy strategy) {this.strategy = strategy;}public <T extends Comparable<T>> void sort(List<T> items) {strategy.sort(items);}}

这只是一些常见的设计模式,Java一共有23种设计模式,实际掌握几种设计模式就可以帮助你更好地组织代码、提高代码的可维护性和可扩展性。

相关文章:

浅谈Java常见设计模式及实例

前言 Java 中常用的设计模式有很多种&#xff0c;其实平常用到的还比较少&#xff0c;但是还是有必要了解一下&#xff0c;可以按照实际情况运用到我们的代码中。按照类型可以基本分解为&#xff0c;创建型模式、结构型模式和行为型模式。 创建型模式 (Creational Patterns) 1…...

【RISC-V DSP设计】基于CEVA DSP架构的指令集分析(一)-总体介绍

目录 一、引言 二、CEVA-BX1™ DSP Library 概述 三、CEVA-BX1™ DSP Library 功能与特点 四、CEVA-BX1™ DSP Library 优势 今天开始我们继续对CEVA DSP的架构和指令集进行分析&#xff0c;基于对CEVA DSP的分析和了解&#xff0c;后续可以进行基于RISC-V内核架构的DSP指令…...

Rust标量类型详解

在Rust中&#xff0c;数据类型分为标量类型和复合类型。本篇博客将重点介绍Rust的标量类型&#xff0c;其中包括整数类型、浮点类型、布尔类型以及字符类型。 整数类型 Rust提供了多种整数类型&#xff0c;分为带符号整数和无符号整数。带符号整数表示可以为正数、零或负数&a…...

【双指针】【C++算法】1537. 最大得分

作者推荐 【深度优先搜索】【树】【图论】2973. 树中每个节点放置的金币数目 本文涉及知识点 双指针 LeetCoce 1537. 最大得分 你有两个 有序 且数组内元素互不相同的数组 nums1 和 nums2 。 一条 合法路径 定义如下&#xff1a; 选择数组 nums1 或者 nums2 开始遍历&…...

golang常用库之-操作数据库ORM:GORM 包介绍 | 一些 GORM 提示和注意事项

文章目录 golang操作数据库ORM&#xff1a;GORM 包介绍及实战一、什么是GORM 包二、GORM基本使用官方快速开始demo 一些 GORM 提示和注意事项 参考 golang操作数据库ORM&#xff1a;GORM 包介绍及实战 一、什么是GORM 包 官网&#xff1a;https://gorm.io/ github&#xff1a…...

Stream流学习笔记

Stream流 创建流中间操作1、filter2、map3、distinct4、sorted5、limit6、skip7、flatMap 终结操作1、forEach2、count3、max&min4、collect5、查找与匹配 创建流 单例集合&#xff1a;集合对象.stream() List<Integer> list new ArrayList<>(); Stream<…...

单片机——FLASH(2)

文章目录 flash &#xff08;stm32f40x 41x的内存映射中区域详解&#xff09;flash写数据时 flash &#xff08;stm32f40x 41x的内存映射中区域详解&#xff09; Main memory 主存储区 放置代码和常数 System memory 系统存储区 方式bootloader代码 OTP区 一次性可编程区 选项…...

个体诊所门诊电子处方开单管理系统软件,配方模板病历模板设置一键导入操作教程

个体诊所门诊电子处方开单管理系统软件&#xff0c;配方模板病历模板设置一键导入操作教程 一、前言 以下操作教程以 佳易王诊所电子处方软件V17.2为例说明&#xff0c;最新版V17.3下载可以点击最下方官网卡片了解。 1、在现实生活中&#xff0c;医师开单可谓是争分夺秒&…...

ELAdmin 配置定时任务

定义方法 在自己的 Module 中写个要执行的方法。 比如获取微信公众号的 accessToken&#xff0c;每两个小时更新一次。这种的其实使用 Spring 的 Scheduled 更方便些&#xff0c;此处仅为演示。 package me.zhengjie.mp.task;import com.alibaba.fastjson.JSON; import lombo…...

【服务器部署】Docker环境的安装

基于CentOS系统的服务器环境下安装Docker环境&#xff0c;安装步骤参考官方指南&#xff1a;https://docs.docker.com/engine/install/centos/ 配置库 sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-c…...

leetcode刷题--贪心算法

七. 贪心算法 文章目录 七. 贪心算法1. 605 种花问题2. 121 买卖股票的最佳时机3. 561 数组拆分4. 455 分发饼干5. 575 分糖果6. 135 分发糖果7. 409 最长回文串8. 621 任务调度器9. 179 最大数10. 56 合并区间11. 57 插入区间13. 452 用最少数量的箭引爆气球14. 435 无重叠区间…...

《Java 简易速速上手小册》第5章:Java 开发工具和框架(2024 最新版)

文章目录 5.1 Maven 和 Gradle - 构建你的堡垒5.1.1 基础知识5.1.2 重点案例&#xff1a;使用 Maven 构建一个简单的 Java 应用5.1.3 拓展案例 1&#xff1a;使用 Gradle 构建一个 Spring Boot 应用5.1.4 拓展案例 2&#xff1a;使用 Maven 管理多模块项目 5.2 Spring 框架 - 你…...

Python json解析

在Python中解析JSON&#xff08;JavaScript Object Notation&#xff09;非常简单&#xff0c;标准库中的json模块提供了必要的功能。JSON是一种轻量级的数据交换格式&#xff0c;易于人阅读和编写&#xff0c;同时也易于机器解析和生成。 以下是使用Python解析JSON的一些基本…...

[FFmpeg学习]从视频中获取图片

从视频中获取图片是一个比较直观的例子&#xff0c;这里从一个基础的例子来查看FFmpeg相关api的使用&#xff0c;从mp4文件中获取一帧图像&#xff0c;保存为jpeg格式图片&#xff0c;mp4文件比较好准备&#xff0c;一般手机录屏文件就是mp4格式。 原理还是比较清楚&#xff0…...

Redis集中管理Session和系统初始化参数详解

Redis 是一个开源的、基于内存的键值存储系统&#xff0c;通常用作数据库、缓存或消息传递系统。在 Web 应用程序中&#xff0c;Redis 常用于集中管理 Session 数据和系统初始化参数。 Redis 管理 Session Session 是 Web 应用程序中用于保持用户状态的一种机制…...

[网鼎杯 2020 朱雀组]phpweb

抓包发现两个参数&#xff0c;结合报文返回的warning猜测两个参数一个传函数名&#xff0c;另一个传函数参数 尝试直接system(ls /)&#xff0c;发现被过滤了 file_get_contents获取index.php的源码&#xff0c;发现可以反序列化实现RCE 这里复现的时候不知道为什么显示不全…...

情人节html代码

一、一个带有心形和祝福消息的页面 如果想在网页上创建一个简单的情人节祝福&#xff0c;可以使用HTML和CSS。以下是一个简单的例子&#xff0c;它创建了一个带有心形和祝福消息的页面&#xff1a; <!DOCTYPE html> <html> <head> <title>情人节…...

键盘重映射禁用 CtrlAltDel 键的利弊

目录 前言 一、Scancode Map 的规范 二、禁用 CtrlAltDel 的方法及其缺陷 三、编程实现和测试 3.1 C 实现的简易修改工具 3.2 C# 实现的窗口工具 四、总结 本文属于原创文章&#xff0c;转载请注明出处&#xff1a; https://blog.csdn.net/qq_59075481/article/details…...

【网工】华为设备命令学习(综合实验一)

实验要求和实验成果如图所示。 LSW2不需要其他配置&#xff0c;其下就一台设备&#xff0c;不需要区分。 LSW3配置如下&#xff1a; <Huawei>sy Enter system view, return user view with CtrlZ. [Huawei]un in en //关闭系统提示信息 Info: Information …...

JavaScript中的常见算法

一.排序算法 1.冒泡排序 冒泡排序比较所有相邻的两个项&#xff0c;如果第一个比第二个大&#xff0c;则交换它们。元素项向上移动至 正确的顺序&#xff0c;就好像气泡升至表面一样。 function bubbleSort(arr) {const { length } arrfor (let i 0; i < length - 1; i)…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...