java设计模式和面向对象编程思想

news2024/11/25 21:33:13

Java设计模式和面向对象编程思想是软件开发中的核心概念,对于构建可维护、可扩展的软件系统至关重要。下面是对这两个主题的知识点总结:

面向对象编程(OOP)思想

  1. 封装:将数据(属性)和操作这些数据的方法(行为)封装在一起,隐藏内部实现细节,仅通过公共接口与外部交互。这有助于减少代码间的耦合度,提高模块化。

  2. 继承:允许创建分层次的类结构,子类可以继承父类的属性和方法,并可添加或覆盖它们。这支持代码复用,增强了软件的可扩展性。

  3. 多态:同一接口可以被不同的类以不同方式实现,即子类可以根据需要覆盖父类的方法。多态提高了代码的灵活性和可维护性。

  4. 抽象:通过抽象类或接口来定义对象的基本形态和行为,不关注具体实现。抽象让程序员专注于对象的接口而非其实现细节。

面向对象编程(Object-Oriented Programming, OOP)是一种编程范式,强调将程序设计中的各种要素封装进对象中,通过对象的交互来设计和实现应用程序。OOP的核心思想主要围绕以下几个基本原则:

1. 封装(Encapsulation)

封装是将对象的状态(数据成员/属性)和行为(成员方法/函数)捆绑在一起,并对外界隐藏其内部实现细节的过程。通过设置访问权限(如Java中的public、private、protected),可以控制对对象内部数据的直接访问,从而保护数据的完整性,减少错误,并增强模块间的独立性。

2. 继承(Inheritance)

继承允许一个类(子类/派生类)继承另一个类(父类/基类)的属性和方法,实现代码的复用。子类可以继承父类的所有非私有属性和方法,并可以增加或重写父类的方法以适应更具体的需求。这有助于建立类的层次结构,促进软件的模块化设计。

3. 多态(Polymorphism)

多态意味着一个接口可以有多种实现方式,或者一个类实例的相同消息可以产生多种响应。在Java等面向对象语言中,多态主要通过方法重写(Override)和接口实现来体现。它使得代码更加灵活和可扩展,因为可以在运行时根据对象的实际类型来决定调用哪个方法,而不是在编译时确定。

4. 抽象(Abstraction)

抽象是指将复杂的系统分解为更简单的组成部分,关注关键特性和行为,忽略不必要的细节。在OOP中,抽象类或接口用来定义一个或多个类的共同属性和操作,但不提供具体实现。抽象类不能被实例化,其目的是为了被子类继承。接口则完全由抽象方法组成,强制实现类遵循某种规范或协议。

实践中的应用

  • 模块化:通过封装和抽象,将复杂系统分解为小的、相互独立的模块,便于管理和维护。
  • 代码复用:继承减少了重复代码,提高了开发效率和代码质量。
  • 灵活性与扩展性:多态和抽象使得系统容易适应变化,增加新功能或修改现有功能时不会对整个系统造成太大影响。
  • 设计模式:许多经典的设计模式(如单例、工厂、策略等)都是基于OOP原则,用于解决特定设计问题,提升软件设计的优雅性和健壮性。

综上所述,面向对象编程思想通过封装、继承、多态和抽象四大原则,促进了软件的模块化、灵活性、可维护性和代码复用,是现代软件开发不可或缺的基础。

Java设计模式

设计模式是在特定情境下解决常见设计问题的标准化解决方案。它们分为三大类:创建型、结构型和行为型模式。

Java设计模式是软件开发中解决常见设计问题的通用解决方案,分为三大类:创建型、结构型和行为型模式。以下是这些模式的详细知识点总结:

创建型模式(Creational Patterns)

  1. 单例模式(Singleton)

    • 目的:确保一个类只有一个实例,并提供一个全局访问点。
    • 实现:使用私有构造函数、静态私有实例和公开的静态方法确保只创建一个对象。
  2. 工厂方法模式(Factory Method)

    • 目的:定义一个用于创建对象的接口,但让子类决定实例化哪一个类。
    • 实现:声明一个用于创建对象的接口,让子类决定具体的类。
  3. 抽象工厂模式(Abstract Factory)

    • 目的:为创建一组相关或相互依赖的对象提供一个接口,而无需指定它们的 concrete 类。
    • 实现:定义接口用于创建一系列相关或相互依赖的对象,而不需要指定它们的具体类。
  4. 建造者模式(Builder)

    • 目的:将复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。
    • 实现:使用Builder类逐步构建产品对象,Director负责管理构建过程。
  5. 原型模式(Prototype)

    • 目的:通过复制现有的实例来创建新的对象,以减少创建新对象的成本。
    • 实现:实现Cloneable接口,重写clone()方法以深拷贝或浅拷贝对象。

结构型模式(Structural Patterns)

  1. 适配器模式(Adapter)

    • 目的:将一个类的接口转换为客户期望的另一个接口,使原本不兼容的类可以一起工作。
    • 实现:创建一个适配器类,继承或组合原有类,并实现目标接口。
  2. 桥接模式(Bridge)

    • 目的:将抽象部分与实现部分分离,使它们可以独立变化。
    • 实现:定义抽象类和实现类,通过组合而非继承来实现二者之间的松耦合。
  3. 装饰器模式(Decorator)

    • 目的:动态地给一个对象添加一些额外的职责,而不改变其结构。
    • 实现:创建装饰器类,包装原有的对象,并可以添加额外的行为。
  4. 组合模式(Composite)

    • 目的:将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
    • 实现:定义Component接口,声明操作,Composite类实现Component并管理子组件。
  5. 外观模式(Facade)

    • 目的:为子系统中的一组接口提供一个一致的高层接口,简化客户端与子系统的交互。
    • 实现:创建一个Facade类,该类提供了简化的方法来调用子系统中的复杂操作。
  6. 享元模式(Flyweight)

    • 目的:运用共享技术有效地支持大量细粒度的对象。
    • 实现:创建Flyweight类存储共享状态,客户端通过Factory获取Flyweight对象,外部状态由客户端维护。

行为型模式(Behavioral Patterns)

  1. 观察者模式(Observer)

    • 目的:定义对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。
    • 实现:Subject(被观察者)维护Observer(观察者)列表,状态改变时通知所有观察者。
  2. 模板方法模式(Template Method)

    • 目的:定义一个操作中的算法骨架,而将一些步骤延迟到子类中实现。
    • 实现:在父类中定义模板方法,具体步骤留给子类去实现。
  3. 策略模式(Strategy)

    • 目的:定义一系列算法,将每一个算法封装起来,并使它们可以互相替换。
    • 实现:定义策略接口,具体策略类实现接口,Context使用策略。
  4. 迭代器模式(Iterator)

    • 目的:提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。
    • 实现:定义Iterator接口,聚合类实现创建Iterator的方法。
  5. 责任链模式(Chain of Responsibility)

    • 目的:将请求的处理分散到多个对象中,每个对象根据情况决定是否处理请求或将其传递给下一个对象。
    • 实现:创建处理请求的Handler类,每个Handler持有下一个Handler的引用。
  6. 命令模式(Command)

    • 目的:将请求封装为一个对象,从而使可以用不同的请求、队列或日志来参数化其他对象。
    • 实现:定义Command接口,ConcreteCommand实现接口执行具体操作,Invoker调用Command。
  7. 状态模式(State)

    • 目的:允许对象在其内部状态改变时改变其行为,对象看起来似乎修改了它的类。
    • 实现:定义State接口和具体状态类,Context持有一个State引用,根据状态改变行为。
  8. 访问者模式(Visitor)

    • 目的:表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
    • 实现:定义Visitor接口和具体访问者,Element定义接受访问者的方法,Composite和Leaf实现Element接口。

掌握这些设计模式,可以帮助Java开发者编写出更灵活、可维护、易于扩展的代码。

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

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

相关文章

Linux C编译器从零开发一

基础程序汇编 test.c int main() {return 42; } 查看反汇编 cc -o test test.c objdump -d -M intel test 0000000000001129 <main>:1129: f3 0f 1e fa endbr64 112d: 55 push rbp112e: 48 89 e5 mov rbp,rsp1131: b…

攻防世界-fakebook题目__详解

1.打开题目先用dirsearch工具扫描一波&#xff0c;扫出来了robots.php目录&#xff0c;然后访问robots.txt 目录&#xff0c;发现了有一个备份文件 &#xff0c;访问备份文件&#xff0c;下载内容 文件的大致内容如下 里面有一个curl_exec这个函数容易造成ssrf攻击的漏洞 我…

运行时类型识别RTTI(typeid dynamic_cast)和虚函数机制的关系

1.typeid 2.dynamic_cast 指针类型决定了可以操作的内存范围大小 子类指针转化为父类类型的指针的一般是合法的&#xff1a; 父类的指针类型转化为子类类型指针&#xff0c;超过合法操作范围&#xff0c;不安全 两种转换&#xff1a;编译期的转换&#xff0c;运行时的转化 编译…

四川汇聚荣聚荣科技有限公司是干什么的,拼多多运营如何做?

四川汇聚荣聚荣科技有限公司是干什么的&#xff0c;拼多多运营如何做?随着电商行业的快速发展&#xff0c;越来越多的企业开始涉足这一领域。其中&#xff0c;四川汇聚荣聚荣科技有限公司便是其中的一员。那么&#xff0c;这家公司究竟是做什么的呢?简单来说&#xff0c;它是…

【代码随想录】【算法训练营】【第35天】[134]加油站 [135]分发糖果 [860]柠檬水找零 [406]根据身高重建队列

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 LeetCode。 day 35&#xff0c;连休两天~ 题目详情 [134] 加油站 题目描述 134 加油站 解题思路 前提&#xff1a;数组 思路&#xff1a;全局贪心算法&#xff1a;最小累加剩余汽油为负数&#xff0c;说明…

短视频矩阵系统源码搭建--如何基于各平台原生态坏境做开发

短视频矩阵系统源码搭建是一个涉及多个技术层面的复杂过程&#xff0c;它要求开发者能够理解并利用不同平台的原生环境来开发和部署应用程序。以下是一些基于不同平台原生环境开发短视频矩阵系统的一般步骤和考虑因素&#xff1a; 1.需求分析&#xff1a;首先明确系统需要实现的…

Python学习笔记9:入门知识(九)

缩进 什么是缩进&#xff1f; 缩进&#xff0c;简单的理解为本行的首字符相比上一行的首字符位置相对靠后。目前笔者接触的编程语言缩进一般是4字符&#xff0c;直接可以按tab键就行。 为什么突然讲缩进&#xff1f; Python这门语言&#xff0c;是依靠缩进来判断当前行与上…

ISP图像算法面试准备(1)

ISP图像算法面试准备 ISP图像算法面试准备(1) 文章目录 ISP图像算法面试准备前言一、ISP流程二、重点关注1. AWB必须在Demosaic之后进行。2. Gamma矫正通常在CCM之前进行 三、如何实现ISP参数自动化调试四、AE&#xff0c;即自动曝光&#xff08;Auto Exposure&#xff09;总结…

【深度学习】基于EANet模型的图像识别和分类技术

1.引言 1.1.EANet模型简介 EANet&#xff08;External Attention Transformer&#xff09;是一种深度学习模型&#xff0c;它结合了Transformer架构和外部注意力机制&#xff0c;特别适用于图像分类等计算机视觉任务。以下是关于EANet的详细解释&#xff1a; 1.1.1 定义与背…

Qt项目天气预报(3) - qt的http编程获取天气数据

概念 Qt中的HTTP编程主要涉及使用Qt的网络模块来进行HTTP请求和处理HTTP响应。Qt提供了一系列类来处理网络通信&#xff0c;其中最常用的类是 QNetworkAccessManager 、 QNetworkRequest 、 QNetworkReply 以及相关的支持类。 编程实例 以下是一个基本的HTTP编程示例&#xff0…

优雅谈大模型12:一文读懂LoRA/DoRA/MoRA

Microsoft于2021年推出的LoRA是一种经济型微调模型参数的方法。现在大模型的参数规模动不动都在10亿级别以上&#xff0c;微调大模型&#xff08;微调这里代表着SFT&#xff0c;例如读者将某个大模型拿到自身领域&#xff0c;想使用自身领域的知识再次训练和精校大模型&#xf…

Gradle实现类似Maven的profiles功能

版本说明 GraalVM JDK 21.0.3Gradle 8.7Spring Boot 3.2.5 目录结构 指定环境打包 application.yml/yaml/properties 执行 bootJar 打包命令前要先执行 clean【其它和 processResources 相关的命令也要先执行 clean】&#xff0c;否则 active 值不会变&#xff01; spring…

计算机网络:网络层 - IP数据报的转发

计算机网络&#xff1a;网络层 - IP数据报的转发 基于终点转发最长前缀匹配二叉线索树路由表特殊路由特定主机路由默认路由 IP多播 基于终点转发 路由器转发报文时&#xff0c;是通过报文中的目的地址字段来转发的&#xff0c;也即是说路由器只知道终点的IP地址&#xff0c;根…

一种新的一维时间序列信号盲解卷积算法(以旋转机械故障诊断为例,MATLAB环境)

一种新的一维时间序列信号盲解卷积算法&#xff08;以旋转机械故障诊断为例&#xff0c;MATLAB环境&#xff09;&#xff0c;可作为深度学习信号前处理过程&#xff0c;水个SCI不是问题。 机械设备的状态信号中往往蕴含着大量的设备异常信息。如何从繁多的机械状态信号中提取足…

每日一练:攻防世界:ewm

这道题我尝试了使用montagegaps解题&#xff0c;但是没有解出来&#xff0c;图片数量不是很多&#xff0c;可以尝试用PS直接拼图&#xff0c;但是这样学不到东西&#xff0c;我也就没尝试&#xff0c;直接看的官方WP 这段代码应该是改变工作目录到small&#xff0c;并且变量当…

第九届星华杯网络邀请赛

T1喵星人的身高 T2犇犇碑 T3嘤嘤词典 T4三角区间和

spring注解驱动系列-- spring容器创建原理

从源码开始探究spring容器的创建原理&#xff0c;下面是源码总步骤 Override public void refresh() throws BeansException, IllegalStateException {synchronized (this.startupShutdownMonitor) {// Prepare this context for refreshing.prepareRefresh();// Tell the subc…

机器人运动学笔记

一、建模 参考资料&#xff1a;https://zhuanlan.zhihu.com/p/137960186 1、三维模型和连杆、关节定义 2、设置z轴 SDH和MDH会不一样&#xff0c;主要的区别在于SDH中坐标系在连杆末端&#xff0c;MDH中坐标系在连杆首端。虽然这里只是给出z轴&#xff0c;但是由于后面原点位…

React 渲染流程分析

React 页面是由组件组成的&#xff0c;从根组件直到叶组件&#xff0c;内部的组件数通过 Fiber 来保存并触发并发更新。页面的展示分为两部分&#xff0c;首先是初始化&#xff0c;所有组件首次展示&#xff0c;都要进行渲染&#xff0c;之后是更新流程&#xff0c;也就是页面产…

简单的心电图信号分割方法

代码很简单&#xff0c;很容易看懂。 import pandas as pdimport matplotlib.pyplot as plt #headers [Name, Age, Marks]df pd.read_csv(samples-folder/samples2.csv) dfdf.drop(0)dfdf.drop(1)# print(df) if(len(df.columns) 3): df.columns [sample interval, sig…