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

devtools/2024/10/7 23:26:09/

一、设计模式

设计模式(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.ppmy.cn/devtools/24147.html

相关文章

李廉洋:4.30非农即将来临,黄金原油是涨是跌,必看策略。

目前美国10年期国债收益率4.6%的水平反映出市场预期,即在经济持续增长的情况下,通胀可能会持续高于美联储2%的目标。美债收益率飙升背后的原因很简单,因为通胀水平似乎远高于美联储的目标,徘徊在3%左右,并且有反弹的迹…

【中级软件设计师】上午题12-软件工程(3):项目活动图、软件风险、软件评审、软件项目估算

【中级软件设计师】上午题12-软件工程(3) 1 软件项目估算1.1 COCOMO估算模型1.2 COCOMOⅡ模型 2 进度管理2.1 gantt甘特图2.2 pert图2.3 项目活动图2.3.1 画项目图 3 软件配置管理4 软件风险4.1 风险管理4.2 风险识别4.3 风险预测4.4 风险评估4.5 风险控…

6-动态路由

前文提到用户可以通过url访问到不属于自己权限的页面,这需要通过动态路由来解决 1.将后端返回的菜单数据存储到Cookie之后,调用状态管理中添加路由方法 //调用store中的setMenu函数this.$store.commit(setMenu,data.data.data)// 动态路由配置this.$sto…

UG NX二次开发(C++)-获取模型中所有的拉伸(Extrude)特征

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、前言2、在UG 12中创建几个拉伸特征3、UFun中获取对象类型4、通过NXOpen过渡5.测试结果1、前言 在采用UG NX二次开发时,有时需要在模型中获取特定的对象,比如拉伸特征、关联特征等等。但是通过…

面试过程种遇到的面试题收集

文章目录 讲一讲这个项目是干什么的?需求规格说明书有哪些章节?职工部门层级如何显示在一张SQL表上?需求开发用到了哪些技术?HashMap 底层数据结构说一下?介绍一下红黑树?HashMap是线程不安全的&#xff0c…

uniapp 微信小程序 分享海报的实现

主页面 <template><view class"page"><!-- 自定义导航栏--><Navbar title"我的海报"></Navbar><view class"container"><poster ref"poster" :imageUrl"image" :imageWidth"7…

C++ 点云单木分割(欧氏距离法)

基于欧式距离的单木分割方法相对简单且直观,但存在一些缺点,存在噪声或物体边缘不清晰时会影响分割结果。 一、代码示例 #include <pcl/io/pcd_io.h> #include <pcl/filters/voxel_grid.h> #include <pcl/surface/concave_hull.h> #include <pcl/conso…

QWidget | Qt::WindowType 枚举的取值及意义QFlags 模板类详解

01 与 QWidget 类有关的部分类的继承图 3、QObject 是所有 Qt 对象的基类,QPaintDevie 是所有可绘制对象的基类。 4、QWidget 类是所有用户界面对象的基类,QWidget 及其子类是开发桌面应用的核心,这些类都位于 QtWidgets 模块内,注意:QtWidgets 是模块,QWidget 是类(少一…