Java设计模式_概述(设计模式类型和基本原则)

一、设计模式

设计模式(Design pattern)代表了最佳的实践,是软件开发人员在软件开发过程中面临一般问题的解决方案,是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。是优秀程序猿的经验结晶。
但不推荐刚入门的开发者学习,哪怕把代码搞的一塌糊涂,也要先将功能完成,初学者,迈过坑是必然的,只有对自己编写的代码不满意,你才会体会到设计模式的重要性,也才能更加理解。

二、四大类型

设计模式可以分为四大类:创建型模式(Creational Patterns)、结构型模式(Structural Patterns)、行为型模式(Behavioral Patterns)、J2EE 设计模式
1、 创建型模式;
特点:这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。
好处:这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活
包括:
(1)、 工厂模式(FactoryPattern);
(2)、 抽象工厂模式(AbstractFactoryPattern);
(3)、 单例模式(SingletonPattern);
(4)、 建造者模式(BuilderPattern;
(5)、 原型模式(PrototypePattern);
2、 结构型模式;
特点:这些设计模式主要处理类或对象的组合,通过继承或组合的方式获得更灵活的结构,以适应需求变化对对象结构带来的影响。
好处:简化系统的设计和实现,使其具有更好的可扩展性和可维护性。
包括
(1)、 适配器模式(AdapterPattern);
(2)、 桥接模式(BridgePattern);
(3)、 过滤器模式(Filter、CriteriaPattern);
(4)、 组合模式(CompositePattern);
(5)、 装饰器模式(DecoratorPattern);
(6)、 外观模式(FacadePattern);
(7)、 享元模式(FlyweightPattern);
(8)、 代理模式(ProxyPattern);
3、 行为型模式;
特点:这些设计模式专注于对象之间的通信和职责分配。它们通过类继承或对象组合来划分职责,以应对需求变化对多个交互对象的影响。
好处:有助于系统的行为管理,使得系统更加灵活和易于维护。
包括
(1)、 责任链模式(ChainofResponsibilityPattern);
(2)、 命令模式(CommandPattern);
(3)、 解释器模式(InterpreterPattern);
(4)、 迭代器模式(IteratorPattern);
(5)、 中介者模式(MediatorPattern);
(6)、 备忘录模式(MementoPattern);
(7)、 观察者模式(ObserverPattern);
(8)、 状态模式(StatePattern);
(9)、 空对象模式(NullObjectPattern);
(10)、 策略模式(StrategyPattern);
(11)、 模板模式(TemplatePattern);
(12)、 访问者模式(VisitorPattern);
4、 J2EE模式;
主要用于解决在企业级应用开发中的特定问题。
包括:
(1)、 MVC模式(MVCPattern);
(2)、 业务代表模式(BusinessDelegatePattern);
(3)、 组合实体模式(CompositeEntityPattern);
(4)、 数据访问对象模式(DataAccessObjectPattern);
(5)、 前端控制器模式(FrontControllerPattern);
(6)、 拦截过滤器模式(InterceptingFilterPattern);
(7)、 服务定位器模式(ServiceLocatorPattern);
(8)、 传输对象模式(TransferObjectPattern);

三、设计原则

SOLID原则:(5条最核心原则):
1、单一职责原则 (Single Responsibility Principle, SRP)
一个类应该只有一个引起变化的原因。
理解:这意味着一个类应该只有一个职责,当职责变化时,只需修改这个类。这有助于保持类的内聚性,减少类之间的耦合。
2、开放封闭原则 (Open-Closed Principle, OCP)
软件实体(类、模块、函数等)应该是可扩展的,但是不可修改的。
理解:这意味着当需求变化时,我们应该通过添加新的代码来满足这些变化,而不是修改现有的代码。这有助于保持系统的稳定性和可维护性。
3、里氏替换原则 (Liskov Substitution Principle, LSP)
子类型必须能够替换它们的基类型。
理解:这意味着派生类(子类)必须能够无差别地替换其基类(父类),并且程序的行为不会发生变化。这有助于确保代码的正确性和可维护性。
4、接口隔离原则 (Interface Segregation Principle, ISP)
客户端不应该被强制依赖于它们不使用的接口。
理解:这意味着一个类对另一个类的依赖应该是最小的,即一个接口应该小而完备,只包含客户端需要的方法。这有助于减少类之间的耦合,提高系统的可维护性和灵活性。
5、依赖倒置原则 (Dependency Inversion Principle, DIP)
高层模块不应该依赖于低层模块,它们都应该依赖于抽象。
抽象不应该依赖于细节,细节应该依赖于抽象。
理解:这意味着我们应该依赖于抽象(接口或抽象类),而不是具体的实现。这有助于减少类之间的耦合,提高系统的可测试性和可扩展性。

其他5条核心原则:
6、迪米特法则(最少知道原则):一个对象应该对其他对象保持最少的了解。也就是说,一个类应该尽量减少与其他类的耦合度,只与它直接相关的类进行交互。
7、合成复用原则:尽量使用合成/聚合的方式,而不是使用继承来实现代码的复用。继承虽然可以实现代码的复用,但也可能导致类的层次结构过于复杂,破坏封装性。通过合成,可以将已有的类组合成新的类,达到复用的目的,同时保持类的简单和清晰。
8、包内原则:类之间的依赖关系应该尽量减少,尽量限制在包(package)内部。这样可以降低类之间的耦合度,提高系统的可维护性和可扩展性。
9、无环依赖原则:系统中的依赖关系应该形成一个无环的图。也就是说,不应该存在循环依赖的情况,因为循环依赖可能导致代码难以理解和维护。
10、稳定抽象原则:抽象应该比细节具有更强的稳定性。这意味着在设计系统时,应该优先考虑抽象的设计,而不是过早地陷入具体的实现细节中。

学海无涯苦作舟!!!

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

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

相关文章

数据复制的艺术:深拷贝与浅拷贝在JavaScript中的实现方式

前言 📫 大家好,我是南木元元,热爱技术和分享,欢迎大家交流,一起学习进步! 🍅 个人主页:南木元元 目录 赋值和拷贝 浅拷贝与深拷贝区别 浅拷贝的实现方式 1.Object.assign() 2.…

变革 Perplexica:AI驱动的问答搜索引擎

Perplexica是一个开源的人工智能搜索工具,也可以说是一款人工智能搜索引擎,它深入互联网以找到答案。受Perplexity AI启发,它是一个开源选择,不仅可以搜索网络,还能理解您的问题。它使用先进的机器学习算法&#xff0c…

国产Sora诞生!清华团队发布Vidu大模型,可直接生成16秒视频

大模型之争已从单模态转向多模态。 4月27日,在2024中关村论坛年会未来人工智能先锋论坛上,清华大学联合北京生数科技有限公司正式发布了文生视频大模型——Vidu。 在会议上,清华大学人工智能研究院副院长、生数科技首席科学家朱军对外展示了…

windows11家庭版开启Hyper-v

前提:如果在控制面板中-->程序和功能-->启用和关闭windows功能-->没有Hyper-v 1.什么是Hyper-v? Hyper-v分为两个部分:底层的虚拟机平台、上层的虚拟机管理软件 2.Hyper-v安装 2.1新建hyper.cmd文件,写入下面的内容&…

C++初阶-----对运算符重载的进一步理解(2)

目录 1.对于加加,减减运算符的重载理解 2.const修饰的一些事情 3.日期对象之间的减法实现逻辑 1.对于加加,减减运算符的重载理解 (1)在C语言里面,我们已经知道并且了解加加,减减的一些基本的用法&#…

RepeatMasker 基因组重复区域文件

rmsk.txt 一般关注标红的几列, 各列含义: Schema for RepeatMasker - Repeating Elements by RepeatMasker "rmsk.txt" 是 UCSC Genome Browser 提供的一个文件,用于描述重复序列的注释信息。通常,它包含了以下列: 1. **bin**:UCSC Genome Browser 使用的染色…

笔记:编写程序,绘制一个展示 2013~2019 财年阿里巴 巴淘宝+天猫平台的 GMV 的柱形图,实现过程如下:

文章目录 前言一、GMV 的柱形图是什么?二、编写代码总结 前言 编写程序。根据实例 2 的要求,绘制一个展示 2013~2019 财年阿里巴 巴淘宝天猫平台的 GMV 的柱形图,实现过程如下: (1) 导入 matplotlib.pypl…

2024中国(江西)国际先进陶瓷材料及智能装备博览会

2024中国(江西)国际先进陶瓷材料及智能装备博览会 “中国(江西)国际先进陶瓷材料及智能装备博览会” 陶瓷三新展 (新材料、新装备、新技术) 绿色智能、引领未来 2024年11月1日-11月3日 中国江西 南昌…

生活服务推出品牌实惠团购,覆盖五一假期“吃喝玩乐”多场景

4月26日,抖音生活服务平台上线“跟着大牌过五一”活动会场,携手22家连锁品牌商家,于“五一”前推出优价团购和时令新品,覆盖“吃喝玩乐”多重购物需求,助力假期消费。同时,伴随各地涌现的文旅热潮&#xff…

项目:使用LNMP搭建私有云存储

目录 项目:使用LNMP搭建私有云存储 准备工作 回复快照,关闭安全软件 上传软件 设置nextcloud安装命令权限 设置数据库 重启数据库 配置nginx 安装 内网穿透 cpolar的域名信任 项目:使用LNMP搭建私有云存储 准备工作 回复快照&a…

C#上位机与S7-200Smart通信注意事项

S7-200SMART连接 问题描述 我们使用C#开发上位机和S7-200Smart系列PLC交互数据时,大多会用到Sharp7、Snap7之类的通信类库。有些通信类库默认的使用的是PG连接资源,而对于S7-200Smart来说,它的PG连接资源只有1个。 官网200smart提到的连接数…

解决idea不识别${pageContext.request.contextPath}的方法

文章目录 一、产生原因二、解决方法——直接修改web.xml文件三、修改模板——找到web.xml模板,修改替换 一、产生原因 由于web.xml 使用的web-app版本号过低。导致无法识别"{pageContext.request.contextPath}"。 IDEA在创建javaweb项目的时候&#xff0…

imx6ull配置交叉编译环境编译u-boot及linux所遇问题解决记录

文章目录 前言一、问题 1 及解决方法1、问题 1 描述2、问题 1 解决方法 二、问题 2 及解决方法1、问题 2 描述2、问题 2 解决方法 三、问题 3 及解决方法1、问题 3 描述2、问题 3 解决方法 四、问题 4 及解决方法1、问题 4 描述2、问题 4 解决方法 前言 CoM-iMX6UL(L) 是一款兼…

笔记:能量谱密度与功率谱密度(二)

目录 一、ESD与PSD的定义、单位、性质 二、对ESD与PSD的直观理解 三、总结: 某物理量的“分布”在离散系统中,各点(纵坐标含义)的物理意义仍然是该物理量,而在连续系统中,各点(纵坐标含义)的物…

react报错:Warning: Each child in a list should have a unique “key“ prop.

我是万万没想到的,使用Popconfirm不添加key属性也会报错: react-refresh:160Warning: Each child in a list should have a unique "key" prop. Check the render method of Cell. Seehttps://reactjs.org/link/warning-keys for more informa…

STM32点灯大师(点了一颗LED灯,轮询法)

配置操作: 一、使用CubeMX配置到大致的操作 1.1 选择芯片 1.2 选择引脚(根据电路图) 1.3 配置gpio口 1.4 配置系统 1.5文件项目操作 最后就是点击 二、点击CubeMX生成的代码,并且修改代码 2.1 看看效果 2.2 写代码

Python 网络编程实践:从基础到进阶

目录 网络编程 一.IP地址简介 1. IP 地址的概念 1.1. IP 地址的表现形式 1.2. IP 地址的作用 2. 查看 IP 地址 3. 检查网络是否正常 4. 小技巧 二.端口和端口号 1. 什么是端口 2. 什么是端口号 3. 端口和端口号的关系 4. 端口号的分类 4.1. 知名端口号 4.2. 动…

【Unity学习笔记】第十四 Prefab 概念解惑

目录 1 prefab、prefab变体、prefab覆盖和prefab 嵌套2 connect 与unpack3 prefab到底是什么,它和gameobject又有什么区别?4 为什么要用prefab?5 代码动态加载prefab6 为什么我unity PrefabUtility.InstantiatePrefab() 得到的是null7 Prefab…

基于Springboot的租房网站

基于SpringbootVue的租房网站的设计与实现 开发语言:Java数据库:MySQL技术:SpringbootMybatis工具:IDEA、Maven、Navicat 系统展示 用户登录 首页 房屋信息 交流论坛 房屋资讯 后台登录 用户管理 房屋类型管理 房屋信息管理 预…

关于权限的设计

首先系统权限,每个账号登录后,都需要知道这个账号允许访问哪些api,哪些数据权限(一般是指其他账号的一些数据) 这里就需要通过角色来关联。 --1.角色绑定菜单,每个菜单设计的时候包含了这个菜单会用到的所…
最新文章