软件工程期末复习-软件设计模式与体系结构-体系结构

news2024/11/17 5:36:17

目录

  • 软件体系结构概述
  • 一、调用-返回风格软件体系结构
    • 概念
    • 主程序-子程序软件体系结构
    • 自顶向下的设计方法的问题
    • 结构化设计的优缺点
    • 面向对象体系结构
    • 面向对象设计的优缺点
    • 主程序-子程序与面向对象体系结构
      • 相似
      • 差异
    • 课程作业
  • 二、数据流风格软件体系结构
    • 概念
    • 控制流 vs. 数据流
    • 数据流风格三种例子
      • Batch Sequential(批处理)
        • 批处理系统特点
        • 批处理系统案例:数字图像处理软件
      • Pipe-and-Filter(管道-过滤器)
        • 过滤器
        • 管道
        • 管道-过滤器软件体系优点
        • 案例分析:主动型过滤器实例
        • 类图
        • 案例分析:设计遗产文件更新系统
        • 案例分析:数字图像处理系统
        • 顺序批处理系统与管道-过滤器软件体系结构的比较
      • Process Control(控制)
  • 作业
  • 三、基于事件的软件体系结构
    • 显式调用
    • 隐式调用
    • 事件系统软件体系结构的概念
      • 事件系统的连接机制
    • 例子:图形用户界面
    • 事件系统调度策略
      • 1.带有分离的派遣模块的事件管理器
  • 观察者模式
    • 类图
    • 观察者模式应用实例
  • 课程作业
  • 四、层次软件体系结构
    • 两种方式的区别
    • 双向分层
    • 分层风格 VS 主程序-子过程风格:二者的不同
    • 层次软件体系结构的优点
    • 层次软件体系结构的缺点
  • 课程作业
  • 五、MVC软件体系结构
    • MVC软件体系结构的概念与机制
    • MVC模型各部分功能
    • MVC的改变--传播机制
    • MVC软件体系结构的概念与机制(类图)
    • 使用观察者模式的MVC体系结构设计类图
    • MVC软件体系结构应用实例
    • 优缺点
    • 三层体系结构与MVC 软件体系结构的比较
  • 课程作业
    • MVC是一种设计模式还是一种软件体系结构?(***)
    • 画图
  • 课程作业

软件体系结构概述

  1. 调用-返回风格软件体系结构
  2. 数据流风格软件体系结构
  3. 基于事件的软件体系结构
  4. 层次软件体系结构
  5. MVC软件体系结构

一、调用-返回风格软件体系结构

其主要思想是:将一个复杂的大系统分解为一些子系统,以便降低复杂度,并且增加可修改性

概念

  1. 每个软件构件都设计为有一个唯一的程序执行起点和一个唯一的程序执行终点;
  2. 程序从其执行起点开始执行该构件的代码,程序执行结束,将控制返回给程序调用构件,
  3. 其中,程序构件通常叫做子程序,
  4. 从一个构件到另外一个构件的控制传递叫做子程序调用。

在这里插入图片描述
调用-返回风格体系结构可以被组织成任何形式。但层次结构的组织形式更清晰
层次结构的设计被称为共享数据的主程序-子程序软件体系结构

主程序-子程序软件体系结构

主程序-子程序软件体系结构在设计上使用层次化的划分方法,该体系结构中使用由编程语言直接支持的单一的控制线程。
子程序的结构是明确的,子程序通常组成程序模块。子程序的调用呈现层次状,其正确与否往往取决于其调用的子程序的正确与否。
相比于非结构化编程,主程序-子程序软件体系结构能够较好地支持系统的可改变性和可伸缩性等性能,其采用分而治之的策略

在这里插入图片描述

自顶向下的设计方法的问题

功能演化困难

现实中的系统功能不容易描述

功能化设计丢掉了数据与数据结构

由功能设计得到的软件产品的可复用的代码较少

结构化设计的优缺点

优点

  1. 逻辑设计与物理设计分离
  2. 开发过程中形成一套规范化的文档,便于将来修改和维护

缺点

  1. 开发周期长,开发过程复杂
  2. 系统难于适应环境变化
  3. 经验表明,较小的程序(小于10万行)适合于结构化开发

面向对象体系结构

封装性
继承性
多态

面向对象设计的优缺点

优点

  1. 容易维护
  2. 可复用性好
  3. 映射现实世界
  4. 容易对一个系统进行剖分

缺点

  1. 面向对象程序占用内存较大
  2. 一个对象要和另外一个对象交互,该对象必须知道另外一个对象的身份,包括对象名、方法名和参数类型等。

主程序-子程序与面向对象体系结构

在这里插入图片描述
在这里插入图片描述

相似

在这里插入图片描述

差异

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

课程作业

在这里插入图片描述
结构化设计、面向对象设计
结构图、
在这里插入图片描述

在这里插入图片描述

二、数据流风格软件体系结构

概念

  1. 数据流系统的各软件组件在无数据到达时处于休眠状态,当有数据到达时,该软件组件被激活,开始对数据进行处理。
  2. 数据流风格软件体系结构将整个软件系统看作由一系列作用在连续数据集合上的“变换”组成。数据和作用于其上的操作是互相独立的
  3. 软件系统被分解为一些数据处理单元或称为组件,数据流控制数据处理顺序。

在数据流风格体系结构中的组件是可以被重复使用的,且在保证输入与输出接口都不变的情况下,可以独立修改一个组件,而不影响其他的组件

注意同步问题

控制流 vs. 数据流

在这里插入图片描述

数据流风格三种例子

Batch Sequential(批处理)
Pipe-and-Filter(管道-过滤器)
Process Control(控制)

Batch Sequential(批处理)

在该系统中,组件为独立的程序,并且这些组件按照先后顺序处理,即只有当一个组件的运行彻底结束以后,下一个组件才能开始执行。可以认为,数据在处理步骤之间的传输是成批(块)的,而不是以数据流的方式进行的。这也是"顺序批处理"名称的由来。

批处理系统特点

  1. 每个处理程序模块都是互为独立的程序
  2. 只有上一程序彻底完成,下一步程序才能开始
  3. 数据作为一个整体进行传输
  4. 因为以上的特点,所以不必对其组件进行同步处理
  5. 因为几个组件只能按照顺序运行,而不能同步运行,所以性能可能比那些能按照几个组件同时运行的程序要差一些
  6. 使用顺序批处理结构设计的软件不适用于要求对数据进行实时处理的系统

批处理系统案例:数字图像处理软件

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Pipe-and-Filter(管道-过滤器)

在管道-过滤器软件体系结构中,每个组件都有一组输入和输出,组件读入输入数据流,经过数据处理,然后产生输出数据流。
在输入被完全消费之前,输出便产生了
组件被称为过滤器,这种风格的连接件就像是数据流传输的管道

过滤器

过滤器三个部分组成

  1. Input Port 负责存储待处理的数据
  2. Filter 负责处理数据
  3. Output Port 负责存储已经处理完的数据

在这里插入图片描述

管道

管道的三个组件

  1. Input Stream 输入流
  2. Pipe 管道
  3. Output Stream 输出流

作用:在过滤器之间传送数据

单向流
可能具有缓冲区
管道形成传输图

不同的管道中流动的数据流,具有不同的数据格式
原因:数据在流过每一个过滤器时,被过滤器进行了丰富、精炼、转换、融合、分解等操作,因而发生了变化

管道-过滤器软件体系优点

并发性:对于海量数据处理问题,可以提高高通量的产出
可复用性:封装了过滤器,使得过滤器可以被非常容易地插入与替换

将每个过滤器的输入/输出限制为单一的,则管道-过滤器退化为顺序批处理系统(Batch sequential)

管道过滤器构成的网络,其输出的正确姓与过滤器的递增处理顺序无关

案例分析:主动型过滤器实例

在这里插入图片描述
在这里插入图片描述

类图

在这里插入图片描述

案例分析:设计遗产文件更新系统

在这里插入图片描述
在这里插入图片描述

案例分析:数字图像处理系统

在这里插入图片描述
在这里插入图片描述
不适合于需要共享大量数据的应用设计
不适合处理交互的应用。当需要增量地显示改变时,这个问题尤为严重;

顺序批处理系统与管道-过滤器软件体系结构的比较

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Process Control(控制)

在这里插入图片描述
在这里插入图片描述

作业

在这里插入图片描述
在这里插入图片描述
a、逻辑图:
在这里插入图片描述

b、设计类图:
在这里插入图片描述

c、每个方法的功能:
Filter类:setInPipe()和setOutPipe()负责设置输入输出管道,Start()和Stop()负责控制过滤器开始工作和暂停工作;
Filter类的子类:processData()负责实现每个子类对应的功能;
Pipe类:read()和write()实现数据的读取与写入,close()实现流的关闭。

在这里插入图片描述

a、逻辑图:
在这里插入图片描述

b、设计类图:
在这里插入图片描述

c、每个方法的功能:

Filter类:setInPipe()和setOutPipe()负责设置输入输出管道,Start()和Stop()负责控制过滤器开始工作和暂停工作;
Filter类的子类:processData()负责实现每个子类对应的功能;
Pipe类:read()和write()实现数据的读取与写入,close()实现流的关闭。

三、基于事件的软件体系结构

计算机中,消息是具有特定含义的数据
事件:能够激活对象功能的动作。当发生这种动作后将给所涉及对象发送一个消息,对象便可执行相应的功能

显式调用

在这里插入图片描述

隐式调用

在这里插入图片描述
隐式调用将调用者与被调用者解耦,调用者可以不知道谁是被调用者。也不知道调用后的后果如何。

事件系统软件体系结构的概念

在这里插入图片描述
在这里插入图片描述

事件系统的连接机制

连接件:事件-过程绑定
过程<事件处理器,事件的接收和处理方>向特定的事件进行注册
构件<事件源>发布事件
当某些事件被发布时,向其注册的过程被隐式调用
调用的次序是不确定的

在某些情况下,一个事件也可能触发其他事件,形成事件链
这种连接机制成为“事件—事件绑定”

例子:图形用户界面

在这里插入图片描述
在这里插入图片描述

事件系统调度策略

1.带有分离的派遣模块的事件管理器

事件派遣模块
功能:负责接收到来的事件并派遣它们到其他模块
派遣方式:
1.广播式:派遣模块将事件广播到所有的模块,但只有感兴趣的模块才去取事件,并触发自身的行为

2.选择广播式:派遣模块将事件送到那些已经注册了的模块中
在这里插入图片描述

观察者模式

在这里插入图片描述
在这里插入图片描述

类图

在这里插入图片描述

  1. Observable:被观察者接口,声明了三个应该实现的方法。在简单的情况下,2. register(obs:Observer) 方法负责将参数中的观察者注册到Subject对象,在Subject对象中保持一个具体的观察者列表,用于记载所有的观察者。unRegister(obs:Observer) 方法用于在列表中删除参数中观察者对象。Notify() 方法用于通知观察者subject状态的改变。
  2. Subject:具体的观察者要依赖的对象,它要实现Observable的所有方法。在Subject中的getState() 方法可以被ConcreteObserver调用,以便得到最新的状态。
  3. Observer:观察者接口,代表依赖对象。观察者可以有多个。
  4. ConcreteObserver:代表具体的观察者对象。

关于setChanged

分为两种情况
1.传统模式
在传统模式中,Observable是接口,方法是可以自己定义的,一般来说就三个方法,注册,取消注册,通知
2.Java API模式
在传统模式中,Observable是抽象类,setChanged是必须的,而且是用来设置一个 boolean 类型的内部标志位,注明目标对象发生了变化。当它为真时,notifyObservers() 才会通知观察者。一般来说,也是三个方法,注册,改变状态,通知

观察者模式应用实例

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

课程作业

当调用Observable类的notifyObserver之前,还应该同时调用什么方法?

在调用Observable类的notifyObserver方法之前,应该先调用setChanged方法。

setChanged方法是Observable类的一个方法,用于设置对象的状态已经改变。它会将Observable对象的changed字段设置为true,表示对象的状态已经发生了改变。

在观察者模式中,当被观察对象的状态发生改变时,需要先调用setChanged方法来标记状态已经改变,然后再调用notifyObserver方法通知所有观察者。这样做的目的是确保只有当状态发生改变时才会通知观察者,避免不必要的通知。

因此,在调用notifyObserver方法之前,应该先调用setChanged方法来设置对象的状态已经改变。这样可以确保观察者能够正确地接收到状态改变的通知。

在这里插入图片描述
1、设计类图:
在这里插入图片描述

2、解释:
 Observable和Observer为接口类,FishbowlGUI为被观察类(实现Observable接口),ChemistryGUI、TemperatureGUI、LevelGUI为观察者类(实现Observer接口)。
 FishbowlGUI有3个私有变量quality、temperature和level,分别代表鱼缸的水质、水温和水位高度,每个私有变量都有其对应的get和set方法。
 三个观察者类都要实现takeAction(Observable s)方法,每个类实现该方法的方式不同:

  1. 当quality超过特定范围时,化学传感器ChemistryGUI排除鱼缸部分废水,补充新水;
  2. 当temperature低于或高于特定温度时,TemperatureGUl开启加热设备或者冷却设备调整水温;
  3. 当level高于或低于特定高度时,LevelGUI开启排水设备,排除部分水或者添加新鲜的水。

该方法通过参数传入一个被观察者对象,当得到通知后,将对被观察者类FishbowlGUI的某些方法进行调用,以便获取变化的状态。

在这里插入图片描述
1、设计类图:
在这里插入图片描述

2、AirportInfo类三个方法的功能:

  1. AddObserver(Observer obs)方法,将多个观察者添加到被观察者的observerList中,以便在通知观察者时使用;
  2. setChanged()和notifyObservers(),通知观察者被观察者对象的状态已经改变,同时会运行观察者对象的update()方法。执行顺序为:setChanged()先执行,notifyObservers()后执行。

3、update方法的参数:

  1. 第一个参数为Observable类型,代表被观察者对象;
  2. 第二个参数为Object类型,代表发生的事件,Object为被观察者的一种状态值,提供给update()方法,以便更新观察者。

4、具体行为:

  1. VoiceInfo类的update()方法完成的工作是从AirportInfo类获取语音机场信息,然后将这些信息发送给乘客;
  2. DisplayInfo类的update()方法负责从AirportInfo类获取文字机场信息,然后将这些信息显示在屏幕上。

5、工作原理:

  1. 被观察者AirportInfo有一个observerList(ArrayList类型)成员变量,用于记载动态添加的观察者。
  2. 对被观察者状态感兴趣的对象(观察者)VoiceInfo和DisplayInfo,应该调用被观察者的addObserver()方法将自己注册为它的一个观察者。
  3. 每当AiportInfo的状态发生改变时,它将调用setChanged()方法和notifyObservers()方法(通知已经注册的观察者VoiceInfo和DisplayInfo)。
  4. 接收到通知以后,VoiceInfo和DisplayInfo都将查询AirportInfo的状态,以便保持状态同步。根据新的状态,VoiceInfo和DisplayInfo将分别调用update()方法执行相关操作。

四、层次软件体系结构

层次之间存在接口,通过接口形成call/return的关系,上层是下层的客户端

层次系统的基本构件:
各层次内部包含的构件

连接件:
层间的交互协议

拓扑结构:
分层

拓扑约束:
对相邻层间交互的约束
在这里插入图片描述

两种方式的区别

在这里插入图片描述

双向分层

在这里插入图片描述

分层风格 VS 主程序-子过程风格:二者的不同

在这里插入图片描述

层次软件体系结构的优点

1.支持逐层抽象的系统设计
2.支持更新
3.支持复用
4.支持测试

层次软件体系结构的缺点

1.并不是每个系统都可以很容易地划分为分层的模式
2.效率降低
3.很难找到合适的、正确的层次抽象方法

课程作业

指出层次软件体系结构的三个典型应用。

  • 网络体系结构
  • 操作系统
  • 应用开发

五、MVC软件体系结构

MVC软件体系结构的概念与机制

MVC体系结构将一个互动的应用分为三部分:Model、View、Controller。Model包含核心功能与数据,View为用户显示信息,Controller处理用户输入
根据责任分离与增加可扩展性的原则,Model应该被设计成独立于特定的输入行为和输出表示的程序。

View模块将模型中的数据显示给用户。而因为相同的数据可以有不同形式的显示方法,所以一个Model可以有很多个View

MVC模型各部分功能

模型的责任

  • 从数据库取出数据,并且赋予数据变量
  • 负责业务逻辑实现
  • 负责数据验证,然后将数据存入数据库

视图的责任

  • 获取用户输入
  • 向controller发送处理请求
  • 接收来自Controller的反馈并将model的处理结果显示给用户

控制器的责任

  • 接收来自客户的请求
  • 调用model业务逻辑方法
  • 调用View显示执行结果

MVC的改变–传播机制

在这里插入图片描述

MVC软件体系结构的概念与机制(类图)

在这里插入图片描述

使用观察者模式的MVC体系结构设计类图

在这里插入图片描述

MVC软件体系结构应用实例

在这里插入图片描述
在这里插入图片描述

优缺点

在这里插入图片描述
在这里插入图片描述

三层体系结构与MVC 软件体系结构的比较

在这里插入图片描述
在这里插入图片描述

课程作业

MVC是一种设计模式还是一种软件体系结构?(***)

MVC(Model-View-Controller)既是一种设计模式,又是一种软件体系结构

作为设计模式,MVC旨在解决用户界面和应用程序逻辑之间的分离问题。它将应用程序分为三个主要组件:模型(Model)、视图(View)和控制器(Controller)。模型负责处理应用程序的数据和业务逻辑,视图负责呈现数据给用户,而控制器负责处理用户输入和协调模型与视图之间的交互。

作为软件体系结构,MVC定义了应用程序的整体结构和组织方式。它提供了一种分层的方式来组织和管理应用程序的各个部分。模型、视图和控制器作为独立的组件存在,并通过定义明确的接口和协议进行通信,实现了松耦合和高内聚的设计。

因此,MVC既是一种设计模式,用于解决特定的设计问题,又是一种软件体系结构,用于组织和管理整个应用程序的结构。它在软件开发中被广泛应用,并具有可扩展性和可维护性等优点。

在这里插入图片描述
将观察者类中的更新方法的参数类型设为Observable,可以使观察者能够获取到被观察对象的具体信息和状态,从而能够根据实际情况作出相应的处理。这样做的好处包括:

  1. 获取被观察对象的状态: 通过将参数类型设为Observable,观察者可以获取到被观察对象的状态信息。这使得观察者能够及时获知被观察对象的更新内容,从而根据具体的状态进行相应的处理。

  2. 实现多态性: 通过使用Observable作为参数类型,观察者可以接收任何符合Observable接口的具体实现类的对象。这种多态性的设计使得观察者能够适用于不同类型的被观察对象,而不需要修改观察者类的代码。这增强了代码的灵活性和可扩展性。

  3. 降低耦合度: 通过使用Observable作为参数类型,观察者与被观察对象之间的耦合度降低。观察者不需要依赖具体的被观察对象类,只需要依赖于通用的Observable接口。这种松耦合的设计使得观察者能够更加独立、可复用和可测试。

总而言之,将观察者类中的更新方法的参数类型设为Observable使得观察者能够获取被观察对象的具体信息和状态,实现多态性,降低耦合度,从而提高了系统的灵活性、可扩展性和可维护性。

画图

在这里插入图片描述
在这里插入图片描述

课程作业

在这里插入图片描述
两层客户端-服务器体系结构是一种常见的软件架构模式,它由两个主要组成部分组成:客户端和服务器。每个组件都有特定的功能和职责。

  1. 客户端层:

    • 胖客户端(Fat Client):在胖客户端架构中,客户端负责处理大部分的应用逻辑和数据处理。它具有丰富的用户界面和功能,能够在本地执行复杂的计算任务和数据处理。胖客户端通常需要在本地安装和运行较大的软件包
    • 瘦客户端(Thin Client):在瘦客户端架构中,客户端主要负责用户界面的显示和用户输入的收集,而应用逻辑和数据处理主要由服务器端完成。瘦客户端相对较轻量,它依赖于服务器提供的应用程序和数据,并通过网络与服务器进行通信和交互。
  2. 服务器层:

    • 服务器:服务器是中央处理单元,负责接收来自客户端的请求并提供所需的服务和数据。服务器层包括应用程序和数据的存储、处理和管理。它负责执行复杂的计算任务和数据操作,并将结果返回给客户端。

在这种体系结构下,程序的工作原理如下:

  1. 客户端向服务器发送请求,请求可能包括用户输入、数据查询等。
  2. 服务器接收到请求后,根据请求的类型和内容,进行相应的数据处理和计算,并生成响应结果。
  3. 服务器将响应结果发送回客户端。
  4. 客户端接收到服务器的响应结果后,根据需要进行界面的更新和显示,同时可能会涉及进一步的用户操作。
  5. 这个过程可能会在客户端和服务器之间进行多次交互,直到完成所需的任务。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

【第一章 flutter学习入门之环境配置】

flutter环境安装 文章目录 flutter环境安装前言一、环境变量配置二、下载Flutter SDK三.排除错误 安装依赖四. 设置Android模拟器五.安装插件VScode打开flutter项目 前言 本文是针对Windows系统环境配置flutter 需要git环境依赖&#xff0c;这里就不做过多赘述 一、环境变量配…

PFASs在固体-溶液体系中分配系数

一、对于PFASs在土壤-溶液体系中的吸附行为,可以用土壤-水分配系数(Kd,L/kg)来表征[1-3]。 Cs为沉积物(sediment)中PFAAs的浓度(ng/g dw);Cw为水(water)中单个PFAAs的浓度(μg/L)。 以往许多研究发现,Ksp与沉积物的有机碳组分有关,表明有机质含量是影响沉积物和孔…

【书】《Python全栈测试开发》——浅谈我所理解的『自动化』测试

目录 1. 自动化测试的What and Why?1.1 What1.2 Why2. 自动化的前戏需要准备哪些必备技能?3. 自动化测试类型3.1 Web自动化测试3.1.1 自动化测试设计模式3.1.2 自动化测试驱动方式3.1.3 自动化测试框架3.2 App自动化测试3.3 接口自动化测试4. 自动化调优《Python全栈测试开发…

PPO算法基本原理及流程图(KL penalty和Clip两种方法)

PPO算法基本原理 PPO&#xff08;Proximal Policy Optimization&#xff09;近端策略优化算法&#xff0c;是一种基于策略&#xff08;policy-based&#xff09;的强化学习算法&#xff0c;是一种off-policy算法。 详细的数学推导过程、为什么是off-policy算法、advantage函数…

47. Compose自定义绘制日历-1

有个日历的需求, 自己实现一下简单的 生成数据 private fun initData() {val listOfCalendar mutableListOf<CalendarData>()val calendar Calendar.getInstance()val todayYear calendar.get(Calendar.YEAR)val todayMonth calendar.get(Calendar.MONTH)val today…

单机和分布式有什么区别?分布式系统相比单机系统的优势在哪里?

写在前面 本文隶属于专栏《大数据理论体系》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和文献引用请见《大数据理论体系》 思维导图 1. 资源共享 单机系统是指只有一…

springboot项目通过nginx访问ftp服务器文件

前文 本来准备记录一下。项目中遇到的springboot项目访问ftp服务器图片、视频问题的&#xff0c;想在我自己服务器上重新部署一遍&#xff0c;然后发现&#xff0c;执行docker的时候报错了。具体报错原因如下&#xff1a; 原因是我重启了一下服务器 Cannot connect to the Do…

ChatGPT实战:生成演讲稿

当众发言&#xff08;演讲&#xff09;是一种传达信息、观点和情感的重要方式。通过演讲&#xff0c;人们可以在公共场合表达自己的观点&#xff0c;向观众传递自己的知识和经验&#xff0c;激发听众的思考和行动。无论是商务演讲、学术讲座还是政治演说&#xff0c;演讲稿的写…

linux查找文件内容命令之grep -r ‘关键字‘

目录 grep命令介绍参数选项 grep命令的使用1. 在指定的文件中查找包含的关键字2. 在指定目录下多个文件内容中查找包含的关键字3.在追加的文件内容中查找关键字4. 统计文件中关键字出现的次数5. vi或vim打开的文件查找关键字(补充) 总结 grep命令介绍 Linux操作系统中 grep 命…

EventBus源码分析

差不多两年没写博客了&#xff0c;最近想着要找工作了&#xff0c;打算复习下一些常用的开源库&#xff0c;也是这篇博客的由来&#xff5e; EventBus使用非常简单 参考&#xff1a;github 再贴一张官网的图 一、示例代码 示例代码是为了便于理解后面注解处理器生成代码的处…

1. MyBatis 整体架构

作为正式内容的第一篇&#xff0c;本次不会介绍具体的技术&#xff0c;而是先从全局视角上对 MyBatis 做一个俯瞰&#xff0c;了解 MyBatis 项目工程的组织结构&#xff0c;以及内部的核心功能模块。 工程结构 打开 MyBatis 的 Github 地址&#xff0c;就可以看到其代码工程结…

C语言:打印用 * 组成的带空格直角三角形图案

题目&#xff1a; 多组输入一个整数&#xff08;2~20&#xff09;&#xff0c;表示直角三角形直角边的长度&#xff0c;即 * 的数量&#xff0c;也表示输出行数。 思路&#xff1a; 总体思路&#xff1a; 找到规律&#xff1a; 行数 列数 < 三角形长度 - 1 打印 两个空格…

一步一步学OAK之十四: 获取OAK设备信息

这一节我们通过调用DepthAI API 来获取OAK设备信息 目录 DeviceBootloader简介获取OAK设备信息的方法Setup 1: 创建文件Setup 2: 安装依赖Setup 3: 导入需要的包Setup 4: 获取可用设备Setup 5: 判断infos的长度Setup 6: 遍历infosSetup 7: 打印提示消息Setup 8: 连接设备Setup…

html_4——知识总结

html_4——知识总结 一、计算机基础知识二、html4总结2.1 html基本结构2.2 全局属性-id,class,style,dir,title,lang2.3 格式排版标签-div,p,h1-h6,br,hr,pre2.4 文本标签-span,en,strong,del,ins,sub,sup2.5 图片标签-img:src,alt,width,height,boder2.6 超链接-a:herf,target…

内部函数和外部函数

文章目录 怎么来的&#xff1f;内部函数外部函数明确一下内外的概念&#xff1a;外部函数的实例fgets()函数 怎么来的&#xff1f; 函数本质上是全局的&#xff0c;因为定义一个函数的目的就是这个函数与其他函数之间相互调用&#xff0c;如果不声明的话&#xff0c;一个函数既…

YouTube正测试屏蔽“广告拦截器”,以确保其广告收入

YouTube目前正在进行一项全球范围内的小规模测试&#xff0c;警告用户关掉他们的广告屏蔽器&#xff0c;否则将被限制观看视频的次数。 周三&#xff08;6月28日&#xff09;&#xff0c;Reddit的一位用户发现&#xff0c;在使用YouTube时弹出了一个窗口&#xff0c;提示该用户…

Cali3F: Calibrated Fast Fair Federated Recommendation System

Decentralized Collaborative Learning Framework for Next POI Recommendation 标定的&#xff08;校准的&#xff09;快速公平联邦推荐系统 1. What does literature study? 提出一个经过校准的快速而公平的联邦推荐框架Cali3F&#xff0c;通过集群内参数共享解决了收敛问…

创新引领未来:RFID技术在汽车装配中的智能革命

射频识别&#xff08;RFID&#xff09;技术作为一种自动识别技术&#xff0c;已经在许多领域得到广泛应用。在汽车装配领域&#xff0c;RFID技术的应用可以提高装配过程的效率、降低人工错误率&#xff0c;并帮助实现自动化和智能化生产。本文将介绍RFID技术在汽车装配中的应用…

动态二维码生成器PHP Dynamic QRcode

什么是 PHP Dynamic QRcode &#xff1f; PHP Dynamic QRcode 是一个允许生成和保存动态和静态二维码&#xff08;QR码&#xff09;的应用。它具有简洁、响应灵敏且用户友好的设计。其中包含您网站中可能需要的一般功能&#xff0c;如&#xff1a;记录管理&#xff08;CRUD&…

【2023,学点儿新Java-27】是的——C语言中的const关键字 | 附:按照类型 快速了解与划分:C语言中的关键字 | goto关键字解释

前情回顾&#xff1a; 【2023&#xff0c;学点儿新Java-26】关键字介绍示例代码&#xff1a;assert 断言&#xff08;如何启用断言&#xff09;&#xff0c;以 验证一个数组的长度是否不为零 为例说明【2023&#xff0c;学点儿新Java-25】如何解决浮点计算存在误差&#xff1a…