【Java设计模式从入门到精通1】设计模式的定义、分类及七大设计原则

引言

Java设计模式从入门到精通-设计模式的定义、设计模式分类及七大设计原则

设计模式简介

在软件开发中,设计模式是解决常见设计问题的最佳实践。它们为开发者提供了一种通用的解决方案,使得代码更加灵活、可复用和可维护。在Java编程语言中,设计模式的应用尤为广泛。接下来,我们将深入探讨设计模式的各个方面。

1. 什么是设计模式

设计模式(Design Pattern)是经过验证的最佳实践,用于解决在软件设计中经常遇到的问题。它不是一种具体的技术或算法,而是一种抽象的解决方案模板,可以应用于多种不同场景。设计模式通常描述了一种通用的结构或者行为,开发者可以根据具体的需求和环境来调整和应用这些模式。

简单来说,设计模式是经验丰富的软件开发者在长期的开发实践中总结出来的,用于解决特定场景下的问题的一种优秀解决方案。

2. 设计模式的重要性

设计模式在软件开发中的重要性主要体现在以下几个方面:

  • 提高代码质量:设计模式是经过验证的最佳实践,遵循这些模式可以提高代码的质量和稳定性。
  • 增强代码的可复用性:设计模式提供了一种通用的解决方案,使得代码更容易被复用,从而减少重复劳动。
  • 提升系统的可维护性:通过应用设计模式,系统的结构更加清晰,代码更加模块化,从而更容易进行维护和扩展。
  • 促进团队协作:当团队成员都熟悉相同的设计模式时,他们可以更快地理解彼此的代码,提高开发效率。

实际应用场景举例:

以“观察者模式”为例,在GUI编程中,当用户界面的某个部分发生变化时(如按钮被点击),我们可能希望通知其他相关的组件进行更新。通过观察者模式,我们可以将这些相关的组件注册为观察者,并在事件发生时通知它们,从而实现松耦合的通信。

3. 设计模式的分类

设计模式大致可以分为三类:创建型模式结构型模式行为型模式

1)创建型模式:关注对象的创建过程,如工厂方法模式、抽象工厂模式、单例模式等。这些模式提供了创建对象的最佳方式,使得代码更加灵活和可扩展。

2)结构型模式:关注如何将类或对象组合成更大的结构,如适配器模式、桥接模式、组合模式等。这些模式有助于我们更好地组织代码,提高系统的清晰度和可维护性。

3)行为型模式:关注对象之间的交互和通信方式,如观察者模式、策略模式、模板方法模式等。这些模式有助于我们管理对象之间的关系,使得系统更加灵活和可扩展。

4. 设计模式的七大设计原则

在设计模式的应用中,有七大设计原则被广泛接受和遵循,它们被称为SOLID原则加上开闭原则和里氏替换原则(实际上SOLID中的“L”指的就是里氏替换原则,但为完整起见,这里仍然单独列出):

  • 单一职责原则(Single Responsibility Principle,SRP):一个类应该只有一个引起变化的原因。这意味着,每个类应该只负责一项功能,从而保持高内聚低耦合。这样做的好处是,当需求变化时,只需要修改相应的类,而不会影响其他类。
  • 开放封闭原则(Open/Closed Principle,OCP):开放封闭原则强调软件实体(类、模块、函数等)应该对扩展开放,对修改封闭。这意味着在不修改现有代码的基础上,通过添加新功能来扩展软件的行为。这一原则旨在提高代码的可维护性和可重用性,同时降低软件开发的复杂性和风险。
  • 里氏替换原则(Liskov Substitution Principle,LSP):子类必须能够替换基类。这一原则强调了基类和子类之间的行为应该是一致的,从而确保在软件系统中使用基类对象的地方都可以用子类对象来替换,而不会破坏系统的正确性。这有助于我们设计出更加灵活和可扩展的系统。
  • 接口隔离原则(Interface Segregation Principle,ISP):客户端不应该依赖它不需要的接口。换句话说,一个类对另一个类的依赖应当是最小的。通过将接口拆分成更小的、更具体的接口,我们可以减少类之间的耦合度,从而提高系统的灵活性和可维护性。
  • 依赖倒置原则(Dependency Inversion Principle,DIP):高层模块不应该依赖于低层模块,它们都应该依赖于抽象。抽象不应该依赖于细节,细节应该依赖于抽象。这一原则强调了抽象的重要性,通过依赖接口或抽象类来实现解耦,从而提高系统的可扩展性和可维护性。
  • 迪米特法则(Law of Demeter,LoD),又称最少知道原则,即一个类对自己依赖的类知道的越少越好。也就是说,对于被依赖的类来说,无论逻辑多么复杂,都尽量将逻辑封装在类的内部。对外除了提供的 public 方法,不对外泄露任何信息。
  • 合成复用原则(Composite Reuse Principle,CRP),在一个新的对象里通过关联关系(组合关系和聚合关系)来使用一些已有的对象,使之成为新对象的一部分;新对象通过委派调用已有对象的方法达到复用功能的目的。简言之:要尽量使用组合/聚合的方式,而不是使用继承关系,达到复用的目的。

结束语

这些原则并不是孤立的,它们在实际应用中经常是相互关联、相互影响的。通过灵活运用这些原则,我们可以设计出更加健壮、灵活和可维护的软件系统。同时,这些原则也是评价一个设计是否优秀的重要标准。在设计过程中,我们应该不断地反思和调整,以确保遵循这些原则,从而提高软件的质量。

接下来,我将发布【Java设计模式从入门到精通】专栏的系列文章,敬请持续关注。以下是大概的计划:

第二章:Java设计模式基础
2.1 面向对象设计原则
2.2 设计模式与面向对象设计原则的关系
第三章:创建型设计模式
3.1 简单工厂模式(Simple Factory Pattern)
3.1.1 概念介绍
3.1.2 Java实现示例
3.1.3 使用场景与优缺点
3.2 工厂方法模式(Factory Method Pattern)
3.2.1 概念介绍
3.2.2 Java实现示例
3.2.3 使用场景与优缺点
3.3 抽象工厂模式(Abstract Factory Pattern)
3.3.1 概念介绍
3.3.2 Java实现示例
3.3.3 使用场景与优缺点
3.4 单例模式(Singleton Pattern)
3.4.1 概念介绍
3.4.2 Java实现示例
3.4.3 使用场景与优缺点
3.5 建造者模式(Builder Pattern)
3.5.1 概念介绍
3.5.2 Java实现示例
3.5.3 使用场景与优缺点
3.6 原型模式(Prototype Pattern)
3.6.1 概念介绍
3.6.2 Java实现示例
3.6.3 使用场景与优缺点
第四章:结构型设计模式
4.1 适配器模式(Adapter Pattern)
4.2 桥接模式(Bridge Pattern)
4.3 组合模式(Composite Pattern)
4.4 装饰器模式(Decorator Pattern)
4.5 外观模式(Facade Pattern)
4.6 享元模式(Flyweight Pattern)
4.7 代理模式(Proxy Pattern)
(注:每个小节均包含概念介绍、Java实现示例以及使用场景与优缺点)
第五章:行为型设计模式
5.1 职责链模式(Chain of Responsibility Pattern)
5.2 命令模式(Command Pattern)
5.3 解释器模式(Interpreter Pattern)
5.4 迭代器模式(Iterator Pattern)
5.5 中介者模式(Mediator Pattern)
5.6 备忘录模式(Memento Pattern)
5.7 观察者模式(Observer Pattern)
5.8 状态模式(State Pattern)
5.9 策略模式(Strategy Pattern)
5.10 模板方法模式(Template Method Pattern)
5.11 访问者模式(Visitor Pattern)
(注:每个小节均包含概念介绍、Java实现示例以及使用场景与优缺点)
第六章:Java设计模式实战
6.1 设计模式在实际项目中的应用
6.2 如何选择合适的设计模式
6.3 设计模式的性能考虑
6.4 避免过度使用设计模式
第七章:总结与展望
7.1 设计模式的优点与局限性
7.2 如何继续深入学习和应用设计模式
7.3 设计模式在未来的发展趋势

这个章节规划旨在为初学者提供一个循序渐进地学习Java设计模式的路径。从基础概念开始,逐步深入到各种设计模式的详细讲解,并通过实战章节帮助读者理解如何在实际项目中应用这些设计模式。

简单动作,深刻联结。在这技术海洋,我备好舟,等你扬帆。启航吧!
🌟点击【关注】,解锁定期的技术惊喜,让灵感与知识的源泉不断涌动。
👍一个【点赞】,如同心照不宣的默契,是我们共同语言的闪亮印记。
📚【收藏】好文,搭建你的专属智慧库,让每次回望都能照亮新知之路。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

可信和可解释的大语言模型推理-RoG

大型语言模型(LLM)在复杂任务中表现出令人印象深刻的推理能力。然而,LLM在推理过程中缺乏最新的知识和经验,这可能导致不正确的推理过程,降低他们的表现和可信度。知识图谱(Knowledge graphs, KGs)以结构化的形式存储了…

成都市水资源公报(2000-2022年)

数据年限:2000-2022年,无2009年 数据格式:pdf、word、jpg 数据内容:降水量、地表水资源量、地下水资源量、水资源总量、蓄水状况、平原区浅层地下水动态、水资源情况分析、供水量、用水量、污水处理、洪涝干旱等

Keysight是德 N9912A 手持式射频分析仪

Keysight是德 N9912A 手持式频谱分析仪 N9912A FieldFox 手持射频分析仪,4 GHz 和 6 GHz 轻盈耐用的电缆与天线分析仪、频谱分析仪、网络分析仪等等。 Keysight FieldFox 便携式分析仪可以在非常恶劣的工作环境中,轻松完成从日常维护到深入故障诊断的…

zabbix server client 安装配置

Zabbix Server 采用源码包部署,数据库采用 MySQL8.0 版本,zabbix-web 使用 nginxphp 来实现。具体信息如下: 软件名 版本 安装方式 Zabbix Server 6.0.3 源码安装 Zabbix Agent 6.0.3 源码安装 MySQL 8.0.28 yum安装 Nginx 1.20…

模型微调方法

文章目录 LoRADoRAMoRA 以下部分参考自: https://mp.weixin.qq.com/s/OxYNpXcyHF57OShQC26n4g LoRA LoRA是微软于2021年推出的一种经济型微调模型参数的方法。 它在冻结大部分的模型参数的情况下,仅仅更新额外的部分参数。其性能与全参数微调相似。 LoRA假设微调期间…

Apache Ranger 2.4.0 集成hadoop 3.X(Kerbos)

1、安装Ranger 参照上一个文章 2、修改配置 把各种plugin转到统一目录(源码编译的target目录下拷贝过来),比如 tar zxvf ranger-2.4.0-hdfs-plugin.tar.gz tar zxvf ranger-2.4.0-hdfs-plugin.tar.gz vim install.properties POLICY_MG…

PD芯片OTG功能的应用 LDR6500

随着科技的飞速发展,智能手机、平板电脑等电子设备已经成为我们日常生活和工作中不可或缺的工具。这些设备的功能日益强大,应用场景也愈发广泛,但随之而来的是对充电和数据传输效率的高要求。在这一背景下,PD(Power De…

Apache Ranger 2.4.0 集成Hive 3.x(Kerbos)

一、解压tar包 tar zxvf ranger-2.4.0-hive-plugin.tar.gz 二、修改install.propertis POLICY_MGR_URLhttp://localhost:6080REPOSITORY_NAMEhive_repoCOMPONENT_INSTALL_DIR_NAME/BigData/run/hiveCUSTOM_USERhadoop 三、进行enable [roottv3-hadoop-01 ranger-2.4.0-hive…

k8s笔记——helm chat与k8s Operator区别

k8s Operator Kubernetes 为自动化而生。无需任何修改,你即可以从 Kubernetes 核心中获得许多内置的自动化功能。 你可以使用 Kubernetes 自动化部署和运行工作负载,甚至 可以自动化 Kubernetes 自身。 Kubernetes 的 Operator 模式概念允许你在不修改…

爱情再启:庄国栋笑谈“玫瑰人生”爱情觉悟

庄国栋,这位电视剧《玫瑰的故事》中的男主角, 最近在一次采访中坦言:“如果给我一次重来的机会, 我绝对会毫不犹豫地选择爱情!” 听到这话, 我不禁想,庄先生,您是不是被剧里的玫瑰…

PotPlayer安装及高分辨率设置

第1步: 下载安装PotPlayer软件 PotPlayer链接:https://pan.baidu.com/s/1hW168dJrLBonUnpLI6F3qQ 提取码:z8xd 第2步: 下载插件,选择系统对应的位数进行运行,该文件不能删除,删除后将失效。 …

(单机架设教程)凯旋|当年的QQ游戏

前言 今天给大家带来一款单机游戏的架设:凯旋 , 当年的QQ游戏 如今市面上的资源参差不齐,大部分的都不能运行,本人亲自测试,运行视频如下: 凯旋单机 搭建教程 此游戏架设需要安装虚拟机, 没有…

pytest测试框架pytest-cov插件生成代码覆盖率

Pytest提供了丰富的插件来扩展其功能,本章介绍下pytest-cov插件,用于生成测试覆盖率报告,帮助开发者了解哪些部分的代码被测试覆盖,哪些部分还需要进一步的测试。 pytest-cov 支持多种报告格式,包括纯文本、HTML、XML …

什么是 Elasticsearch 数据预热?

引言:在现代的信息检索和数据分析领域,Elasticsearch 已经成为一个广泛应用的分布式搜索和分析引擎。作为开源项目的一部分,Elasticsearch 提供了强大的实时搜索和分析能力,使得处理大规模数据变得更加高效和可靠。然而&#xff0…

GPT-5 一年半后发布,对此你有何期待?

IT之家6月22日消息,在美国达特茅斯工程学院周四公布的采访中,OpenAI首席技术官米拉穆拉蒂被问及GPT-5是否会在明年发布,给出了肯定答案并表示将在一年半后发布。此外,穆拉蒂在采访中还把GPT-4到GPT-5的飞跃描述为高中生到博士生的…

在线教育项目(一):如何防止一个账号多个地方登陆

使用jwt做验证,使用账号作为redis中的key,登录的时候生成token放到redis中,每次申请资源的时候去看token 有没有变,因为token每次登录都会去覆盖,只要第二次登录token就不一样了

在我们的大数据平台(XSailbaot)上进行企业级数据建模的思路

1. 背景 笔者所在的公司是差不多二十年前搞CIM(公共信息模型的)起家的。当时公司的前辈搞了基于CIS协议的模型服务器、数据服务器、模式编辑器等,形成了一套基于公共信息模型建模的平台系统。其中可视化建模,建好了模式类以后&am…

SA 注册流程

目录 1. UE开机后按照3GPP TS 38.104定义的Synchronization Raster搜索特定频点 2.UE尝试检测PSS/SSS,取得下行时钟同步,并获取小区的PCI;如果失败则转步骤1搜索下一个频点;否则继续后续步骤; 3.解析Mib,…

设计NOR Flash(SPI接口)的Flashloader(MCU: stm32f4)

目录 概述 1 软硬件 1.1 软硬件信息表 1.2 NOR Flash芯片(W25Q64BVSSI) 1.2.1 W25Q64BVSSI芯片介绍 1.2.2 NOR Flash接口 1.3 MCU与NOR Flash接口 2 SPI Flash功能实现 2.1 软件框架结构 2.2 代码实现 2.2.1 Dev_Inf文件 2.2.2 W25QXX驱动程…

区间动态规划——最长回文子串(C++)

难得心静。 ——2024年6月30日 什么是区间动态规划? 区间动态规划通常以连续区间的求解作为子问题,例如区间 [i, j] 上的最优解用dp[i][j]表示。先在小区间上进行动态规划得到子问题的最优解,再利用小区间的最优解合并产生大区间的最优解。 …