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

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

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开发者编写出更灵活、可维护、易于扩展的代码。

相关文章:

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

Java设计模式和面向对象编程思想是软件开发中的核心概念,对于构建可维护、可扩展的软件系统至关重要。下面是对这两个主题的知识点总结: 面向对象编程(OOP)思想 封装:将数据(属性)和操作这些数据…...

超万卡训练集群网络互联技术解读

超万卡训练集群互联关键技术 大模型迈向万亿参数的多模态升级,万卡集群计算能力亟需飞跃。关键在于增强单芯片性能、提升超节点算力、融合DPU多计算能力,并追求算力能效比极致。这一系列提升将强有力支撑更大规模模型训练和推理,快速响应业务…...

AtomicInteger类介绍

文章目录 一、AtomicInteger的定义二、AtomicInteger的使用场景和作用1.使用场景2.作用 三、AtomicInteger的常用方法四、AtomicInteger的底层原理五、AtomicInteger和Integer的区别1.数据类型与线程安全性2.默认值与初始化3.常用方法与操作:4.内存模型与可见性5.使…...

Es 索引查询排序分析

文章目录 概要一、Es数据存储1.1、_source1.2、stored fields 二、Doc values2.1、FieldCache2.2、DocValues 三、Fielddata四、Index sorting五、小结六、参考 概要 倒排索引 优势在于快速的查找到包含特定关键词的所有文档,但是排序,过滤、聚合等操作…...

【C语言】解决C语言报错:Format String Vulnerability

文章目录 简介什么是Format String VulnerabilityFormat String Vulnerability的常见原因如何检测和调试Format String Vulnerability解决Format String Vulnerability的最佳实践详细实例解析示例1:直接使用不受信任的输入作为格式化字符串示例2:未验证格…...

Python深度学习:Bi-LSTM和LSTM在网络上有什么区别,对比来看

文章目录 LSTM代码解释类定义和构造函数前向传播方法 (`forward`)总结Bi-LSTMLSTM 代码 class BaseLSTMModel(nn.Module):def __init__(self, input_dim, hidden_dim, layer_dim, class_num):super().__init__...

Keepalived LVS群集

一、Keepalived案例分析 企业应用中,单台服务器承担应用存在单点故障的危险 单点故障一旦发生,企业服务将发生中断,造成极大的危害 二、Keepalived工具介绍 专为LVS和HA设计的一款健康检查工具 支持故障自动切换(Failover&#…...

harbor问题总结

1. http协议的仓库docker login不上,更改/etc/docker/daemon.json,加一个镜像仓库地址 http: server gave HTTP response to HTTPS client 分析一下这个问题如何解决中文告诉我详细的解决方案-CSDN博客 2. Error response from daemon: login attempt t…...

windows系统,家庭自用NAS。本地局域网 Docker安装nextcloud

windows系统,家庭自用NAS。本地局域网 Docker安装nextcloud 1、docker安装 太简单了,直接去搜一搜。 docker-compose 相关命令 docker-compose down docker compose up -d2、还是使用老的 在你需要挂载的目录下,新建一个文件,…...

迅狐跨境商城系统|全平台兼容|前端采用uni-app跨端框架,后端采用ThinkPHP5框架

高效实现全平台兼容的迅狐跨境商城系统 迅狐跨境商城系统是一款专为跨境电商企业设计的全平台兼容系统。其前端采用uni-app跨端框架,后端采用ThinkPHP5框架,旨在实现高效的开发和运营管理。 1. 全平台兼容的前端设计 迅狐跨境商城系统的前端采用uni-a…...

Elixir学习笔记——进程(Processes)

在 Elixir 中,所有代码都在进程内运行。进程彼此隔离,彼此并发运行并通过消息传递进行通信。进程不仅是 Elixir 中并发的基础,而且还提供了构建分布式和容错程序的方法。 Elixir 的进程不应与操作系统进程混淆。Elixir 中的进程在内存和 CPU…...

困惑度作为nlp指标的理解示例

为了更清晰地说明困惑度的计算过程以及如何通过困惑度判断模型的优劣,我们可以通过一个简单的例子来演示。假设我们有一个非常简单的文本语料库和两个基础的语言模型进行比较。 示例文本 假设我们的文本数据包括以下两个句子: “cat sits on the mat”…...

01 Pytorch 基础

paddle不需要放数据到gpu! 区别:1.batch_norlization 不同 2. 1.数据处理 1.取一个数据,以及计算大小 (剩下的工作,取batch,pytorch会自动做好了) 2.模型相关 如何得到结果 3.模型训练/模型…...

STL——set、map、multiset、multimap的介绍及使用

文章目录 关联式容器键值对树形结构与哈希结构setset的介绍set的使用set的模板参数列表set的构造set的使用set的迭代器使用演示 multisetmultiset演示 mapmap的定义方式map的插入map的查找map的[ ]运算符重载map的迭代器遍历multimapmultimap的介绍multimap的使用 在OJ中的使用…...

使用C语言,写一个类似Linux中执行cat命令的类似功能

一、详细的代码案例 #include <stdio.h> #include <stdlib.h> #include <string.h>// 函数声明 void cat_file(const char *filename);int main(int argc, char *argv[]) {if (argc < 2) {fprintf(stderr, "Usage: %s filename1 [filename2 ...]\n&…...

【Android】Android系统性学习——Android系统架构

前言 部分内容参考《Android进阶解密》 – 刘望舒 1. Android版本 官方链接&#xff1a;https://developer.android.com/studio/releases/platforms 里面有各个版本的官方文档&#xff0c;有些新功能的用法在这里面。 现在做安卓11&#xff0c;有时候需要向下兼容 2. AOSP …...

鸿蒙应用开发

学习视频&#xff1a; 00.课程介绍_哔哩哔哩_bilibili 官网&#xff1a;开发者文档中心 | 华为开发者联盟 (huawei.com) 开发工具 &#xff1a;DevEcoStudio &#xff0c; 类似Jetbrains 全家桶 ArkTS开发语言 &#xff1a;&#xff08;基于TS,集成了前端语言&#xf…...

索引失效有效的11种情况

1全职匹配我最爱 是指 where 条件里 都是 &#xff0c;不是范围&#xff08;比如&#xff1e;,&#xff1c;&#xff09;&#xff0c;不是 不等于&#xff0c;不是 is not null&#xff0c;然后 这几个字段 建立了联合索引 &#xff0c;而且符合最左原则。 那么就要比 只建…...

字符数组基础知识及题目

死识。。。 字符该如何存储呢&#xff1f;这一点我们在以前就接触过了。用char来存储。 如何输入一个单词呢&#xff1f; char a[10002]; scanf("%s",a); 就不用地址符了。 如何输入句子呢&#xff1f; char a[100002]; gets(a); gets是读入句子的&#xff0c…...

一个简单的玩具机器人代码

编写一个玩具机器人脚本通常取决于机器人的硬件、接口和具体功能。然而&#xff0c;由于我们不能直接控制一个真实的硬件机器人&#xff0c;所以只是写一个模拟的C语言脚本示例&#xff0c;该脚本描述了一个简单的玩具机器人可能执行的一些基本操作。 假设我们的“玩具机器人”…...

设计模式-装饰器模式Decorator(结构型)

装饰器模式(Decorator) 装饰器模式是一种结构模式&#xff0c;通过装饰器模式可以在不改变原有类结构的情况下向一个新对象添加新功能&#xff0c;是现有类的包装。 图解 角色 抽象组件&#xff1a;定义组件的抽象方法具体组件&#xff1a;实现组件的抽象方法抽象装饰器&…...

RK3588开发板中使用Qt对zip文件进行解压

操作步骤&#xff1a; 下载源码quazip-0.7.3.zip &#xff0c;在网上找找下载地址上传源码进行解压&#xff0c;然后使用命令 cd quazip-0.7.3 qmake make主要用的是quazip-0.7.3/quazip这个里面的源码&#xff0c;然后把源码加入到自己创建的qt项目pro中&#xff0c;导入方式…...

三、网络服务协议

目录 一、FTP&#xff1a;文件传输协议 二、Telnet&#xff1a;远程登录协议 三、AAA认证 四、DHCP 五、DNS 六、PPP协议 七、ISIS协议 一、FTP&#xff1a;文件传输协议 C/S架构&#xff0c;现多用于企业内部的资料共享和网络设备的文件传输&#xff0c;企业内部搭建一…...

C++初学者指南第一步---1. C++开发环境设置

C初学者指南第一步—1. C开发环境设置 目录 C初学者指南第一步---1. C开发环境设置1.1 工具1.1.1 代码编辑器和IDE1.1.2 Windows1.1.3 命令行界面 1.2 编译器1.2.1 gcc/g (支持Linux/Windows/MacOSX)1.2.2 clang/clang (支持Linux/Windows/MacOS)1.2.3 Microsoft Visual Studio…...

二维数组与指针【C语言】

二维数组与指针 一维数组一维数组与指针二维数组二维数组与指针总结补充判断以下方式是否正确打印二维数组一维数组 int arr[] = {11, 22, 33, 44};arr:首地址(第一个元素的地址) 一维数组与指针 int arr[] = {11, 22, 33, 44};因为,arr表示的是首地址,等价于 int* p =…...

解决linux下安装apex库报错:ModuleNotFoundError: No module named ‘packaging‘

使用如下命令安装apex&#xff1a; git clone https://github.com/NVIDIA/apex cd apex pip install -v --disable-pip-version-check --no-cache-dir --global-option"--cpp_ext" --global-option"--cuda_ext" ./ 报错&#xff1a; Running command py…...

React基础教程(07):条件渲染

1 条件渲染 使用条件渲染&#xff0c;结合TodoList案例&#xff0c;进行完善&#xff0c;实现以下功能&#xff1a; 当列表中的数据为空的时候&#xff0c;现实提示信息暂无待办事项当列表中存在数据的时候&#xff0c;提示信息消失 这里介绍三种实现方式。 注意这里的Empty是…...

回归预测 | Matlab实现NGO-HKELM北方苍鹰算法优化混合核极限学习机多变量回归预测

回归预测 | Matlab实现NGO-HKELM北方苍鹰算法优化混合核极限学习机多变量回归预测 目录 回归预测 | Matlab实现NGO-HKELM北方苍鹰算法优化混合核极限学习机多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现NGO-HKELM北方苍鹰算法优化混合核极限…...

操作系统——信号

将信号分为以上四个阶段 1.信号注册&#xff1a;是针对信号处理方式的规定&#xff0c;进程收到信号时有三种处理方式&#xff1a;默认动作&#xff0c;忽略&#xff0c;自定义动作。如果不是自定义动作&#xff0c;这一步可以忽略。这个步骤要使用到signal/sigaction接口 2.…...

力扣1482.制作m束花所需的最少时间

力扣1482.制作m束花所需的最少时间 二分答案 check的时候 用一个bool数组判断是否开花找连续的k朵花 const int N 1e510;int st[N];class Solution {public:int minDays(vector<int>& bloomDay, int m, int k) {int n bloomDay.size();if(n < (long long)m*…...

网站建设图片上传/网络推广是什么工作

从另外1台机器配置好的vdi文件&#xff0c;拷贝到本机上的virtualbox导入。 1开始以为是和另外1台虚拟机的ip冲突&#xff0c;然后把ip改了。还是不行。报了 一系列的问题&#xff0c;通过网上解决方案都没啥用。 后来想到有可能是virtualbox网络配置的问题&#xff0c;然后和…...

淘宝网站那个做的/建站平台哪家好

时钟实现实现这个时钟时间需要解决以下三个问题&#xff1a;获得当前时间&#xff0c;并格式化如何可以在页面中显示时间让时间动起来1、获得当前时间&#xff0c;并格式化要获得当前时间&#xff0c;可以使用JavaSctipt的Date对象&#xff0c;默认构造函数会返回当前时间。存储…...

柳市网站建设公司/网络营销的含义

人民创投区块链 封面图来源 | Pexels 来源 | 网络传播杂志 作者 | 杨东 袁宇 作者单位 | 中国人民大学区块链研究院 重庆市沙坪坝区委网信办 区块链技术是颇具争议的新一代信息技术&#xff0c;原因是在区块链技术的落地应用尚未实现之前&#xff0c;数字货币凸显出不受规制…...

搜索引擎费用/seo优化的技巧

DOM&#xff1a;文档对象模型 --树模型文档&#xff1a;标签文档&#xff0c;对象&#xff1a;文档中每个元素对象&#xff0c;模型&#xff1a;抽象化的东西 一&#xff1a;window&#xff1a; 属性&#xff08;值或者子对象&#xff09;&#xff1a;opener:打开当前窗口的源窗…...

网站流量提升/网站提交入口大全

真实案例&#xff1a;查看nginx日志&#xff0c;发现别有用心的人恶意调用API接口刷短信&#xff1a;30966487 115.213.229.38 "-" [05/Jun/2018:14:37:29 0800] 0.003 xxxxxx.com "POST /xxx/sendCheckCode HTTP/1.1" 401 200 46 xx.xx.xx.xx:0000 0.003 …...

怎么免费做网站视频教学/企业网站的作用有哪些

前言 作为一个3-5年的Android工程师&#xff0c;我们经常会遇到这些瓶颈&#xff1a; 1.技术视野窄 长期在小型软件公司&#xff0c;外包公司工作&#xff0c;技术视野被限制的太厉害 2.薪资提升难 初中级Android岗位薪资上升空间有限&#xff0c;基本上你想拿15k以上&#…...