软件设计和体系结构

软件设计和体系结构

一、引言

软件

定义:一系列按照特定顺序组织的计算机数据、指令的集合

特点:

  1. 软件不是生产制造,是设计开发
  2. 软件不会磨损和老化
  3. 软件需要根据实际情况进行定制开发

软件设计的基本原则

  1. 抽象方法

    • 过程抽象:是指具有明确和有限功能的指令序列
    • 数据抽象:描述数据对象的冠名数据集合
  2. 体系结构

    程序构件的结构或组织、这些构件交互的形式以及这些构件所用数据的结构。

  3. 设计模式

    • 含义:模式是指解决某一类问题的方法论
    • 目的:为了可重用代码、让代码更容易被他人理解、保证代码的可靠性

软件体系结构

定义:软件系统的基本组织,包含构件、构件之间、构件与环境之间的关系,以及相关的设计与进化原则等

四个研究领域

  • 通过体系结构描述语言(ADL)解决体系结构描述问题。
    • 目标:提供设计体系结构更好的方法,便于设计人员相互交流,并使用相关工具来分析案例
  • 体系结构领域知识的总结性研究
  • 针对特定领域的框架的研究
  • 软件体系结构形式化支持的研究

二、软件模型和描述

软件模型的发展脉络

功能模型

也可称为过程模型和函数模型,是模型化软件结构方法中的第一个基本模型

对象模型

以对象为核心,通过对象进行对数据组织的抽象并实现数据组织和数据处理的统一,并在此基础上建立面向对象软件构造方法

组件模型

在对象模型的基础上强调了异族对象关系以及独立性问题

配置型组件模型

又称服务器组件模型,专门针对应用服务器,定义其基于组件的基础结构模型

服务模型

服务由数据、业务逻辑、接口及服务描述构成

抽象模型

对软件系统的简化和概括,提供了对系统组成和行为的高层次描述

软件体系结构的描述

  • 非形式化描述

    • 统一建模语言(UML):

      • 可视化的建模语言
      • 建立在对象模型之上的标准系统建模方法
      • 可以对静态或动态结构系统进行建模

      优点:在系统开发的各个阶段具有一致性,可以面向各种应用领域系统建模

  • 形式化描述

体系结构描述语言(ADL)

关注的是使用意图,而缺乏必要的规范定义

含义:一种用于描述软件与系统结构的计算机语言

要素:构件、操作、模式、闭包、规格说明

三、软件体系结构建模和 UML

统一建模语言(UML):

  • 可视化的建模语言
  • 在对象模型基础之上的标准系统建模方法
  • 可以对任何静态或动态的结构系统进行建模

优点:在系统开发的各个阶段具有一致性,可以面向各种应用领域系统建模

特点:

  • 统一标准
  • 面向对象的特性
  • UML在演变过程中提出心的概念:模板、职责。扩展机制等
  • 独立于开发过程

抽象类和接口的区别

  • 抽象类是一种可以包含实现方法和抽象方法的类
  • 接口是一种只包含抽象方法和常量声明的结构
  • 类可以继承一个抽象类但实现多个接口

四、软件设计过程

软件体系结构设计方法

多视图建模

image-20230626085217653

  1. 多视图建模:4+1模型
  2. 逻辑视图:又称概念视图,主要是支持系统功能需求的抽象描述,即系统最终将提供给用户什么样的服务。逻辑视图描述了系统的功能需求及其之间的相互关系。
  3. 开发视图:又称模块视图,主要侧重于描述系统的组织,与逻辑视图密切相关,都描述了系统的静态结构
  4. 过程视图:主要侧重于描述系统的动态行为,即系统运行时所表现出的相关特性,着重解决系统的可靠性、吞吐量、并发性、分布性、容错性
  5. 物理视图:描述如何把系统软件元素映射到硬件上,通常要考虑系统的性能、规模和容错等问题,展示了软件在生命周期的不同阶段中所需要的物理环境、硬件配置、分布状况
  6. 场景视图:场景是用户需求和系统功能实例的抽象,设计者通过分析如何满足每个场景所要求的的约束,来分析软件的体系结构
领域特定的软件体系结构设计

领域特定的软件体系结构(DSSA)是领域工程的核心部分。
领域特定的软件体系结构借鉴领域中已经成熟的软件体系结构,实现解决方案在某个领域内的复用。

五、软件体系结构风格

人们在开发某些类型软件过程中积累起来的组织规则和结构,形成了软件体系结构风格。

软件体系结构风格是描述某一特定应用领域中系统组织方式的惯用模式。

基本风格解析

1. 管道-过滤器

定义:

  • 输入集合输入数据流,输出集合输出数据流
  • 功能模块称为过滤器,连接过滤器之间的通路称为管道
  • 数据流可以在过滤器中进行相关增量计算得到输出流

特征

  • 在管道-过滤器风格中,构件即过滤器,对输入流进行处理、转换,处理后的结果在输出端流出。这种计算 常常是递进的,所以可能在全部的输入接收完之前就开始输出。可以并行地使用过滤器
  • 连接件位于过滤器之间,起到信息流的导管的作用,即管道
  • 每个构件都有输入/输出集合,构件在输入出读取数据流,并在输出处生成数据流,一个构件的输入是上一个构件的输出
  • 过滤器必须是独立的实体,不了解信息流从哪个过滤器流出,也不需要知道信息将流入哪个过滤器。可以 指定输入的格式,可以确保输出的结果,但是可能不知道在管道之后将会是什么样子。过滤器之间也不共享状态

优点

  • 由于每个构件的行为不受其他构件的影响,因此整个系统的行为比较易于理解
  • 支持功能模块的复用
  • 具有较强的可维护性、可扩展性
2.基于事件的隐式调用风格

定义

  • 组件之间不直接调用对方的方法,而是通过发布事件和订阅事件的方式进行通信。当某个组件发生特定事件时,它会通知所有订阅了该事件的其他组件,从而触发相应的响应行为

特点

  • 事件的触发者并不知道哪些构件会响应
3.仓库风格和黑板风格

仓库风格:

  • 定义:基于中央仓储,系统组件通过中央仓库进行通信和协作
  • 特点:
    1. 中心化的数据存储
    2. 低耦合
    3. 同步机制,确保数据的一致性和可靠性
    4. 灵活度高

黑板风格:一种特殊的仓库风格

  • 定义:基于全局的共享知识库(黑板),系统中的组件通过黑板写入和读取信息进行协作和推理
  • 特点:
    1. 全局知识库:系统中的组件通过读写共享的黑板来获取和传递知识
    2. 非确定性推理:组件可根据黑板上的信息进行推理和决策
4.模型-视图-控制器风格

MVC(模型-视图-控制器) 模式:

  • 模型类
  • 视图类
  • 控制类

客户/服务器风格

系统被划分为客户端和服务器端两个角色,客户端发送请求给服务器端,服务器端处理请求并返回响应

优点:

  1. 可扩展性
  2. 可重用性
  3. 灵活性
  4. 性能优化

缺点:

  1. 单点故障
  2. 通信开销
  3. 维护复杂性
  4. 安全性风险

三层 C/S 体系结构风格

在二层中加了一层应用服务器

将系统按照职责划分为客户端、应用服务器和数据库服务器三个层次

优点:

  1. 分离关注点:三层C/S体系结构将用户界面、业务逻辑和数据存储分离,使得各层之间的关注点清晰,提高了系统的可维护性和可扩展性。

浏览器/服务器风格

B/S模式第一层客户机的主体是浏览器。第二层Web服务器是实现B/S结构的关键。

正交软件体系结构

  • 概念:由组织层和线索的构件构成

六、面向对象方法

1、面向对象系统开发过程概述

面向对象的思想设计软件开发的各个阶段,

  • 面向对象的分析(OOA)
  • 面向对象的设计(OOD)
  • 面向对象的编程实现(OOP)

九、设计模式

1.设计模式概述

​ 设计模式的核心思想是总结和积累前人成功的设计经验,通过对这些经验的学习,使得人们在面对新的设计问题时,不用再重复所有的环节,而是尽量套用已有的模式实施,以提高编程的效率。模式是解决特定问题的经验,其实质是软件的复用。
​ 模式由特定的环境,问题、解决方案三个要素组成,按照软件开发的层次可以分为体系结构模式、设计模式、程序模式,体系结构模式属于层次较高的模式,如MVC。
​ 设计模式是对被用来在特定场景下解决一般设计问题的类和相互通信的对象的描述。基本设计模式共23种

2.设计模式的主要作用(*)

  • 优化的设计经验:设计模式为开发者提供了良好的经过优化的设计经验
  • 较高的复用性:设计模式重用面向对象代码提供了一种方便途径,使得复用某些成功的设计和结构更加容易
  • 丰富的表达能力:提供了一种共享的设计语言和思维方式,有助于团队协作开发
  • 降低耦合性:设计模式的基本思想就是将程序中可能变化的部分与不变化的部分进行分离,尽量减少对象之间的耦合。

3.常用设计模式解析(*)

根据目的的不同,将 23 种设计模式分为 三 种

  1. 创建型模式:主要用于创建对象
  2. 结构型模式:主要用于处理类和对象的组合
  3. 行为型模式:主要用于描述对类或对象怎么样交互和怎样分配职责

image-20230626102305222

创建型设计模式

image-20230626102951456

  • 简单工厂模式

    • 定义:定义一个类来负责创建其他类的实例,又称静态工厂方法模式,属于类的创建型模式

      // 产品接口
      interface Product {void operation();
      }// 具体产品类A
      class ConcreteProductA implements Product {@Overridepublic void operation() {System.out.println("具体产品A的操作");}
      }// 具体产品类B
      class ConcreteProductB implements Product {@Overridepublic void operation() {System.out.println("具体产品B的操作");}
      }// 简单工厂类
      class SimpleFactory {public Product createProduct(String productType) {if (productType.equals("A")) {return new ConcreteProductA();} else if (productType.equals("B")) {return new ConcreteProductB();} else {throw new IllegalArgumentException("无效的产品类型");}}
      }// 客户端代码
      public class Client {public static void main(String[] args) {SimpleFactory factory = new SimpleFactory();Product productA = factory.createProduct("A");productA.operation();  // 输出:具体产品A的操作Product productB = factory.createProduct("B");productB.operation();  // 输出:具体产品B的操作}
      }
      
  • 工厂方法模式

    • 定义:对简单工程模式进行了抽象和推广,具体的生产工作推延到其子类去完成

    • ​ 将对象的创建委托给具体的工厂类,从而使得客户端代码与具体的产品类解耦。

      // 产品接口
      interface Product {void operation();
      }// 具体产品类A
      class ConcreteProductA implements Product {@Overridepublic void operation() {System.out.println("具体产品A的操作");}
      }// 具体产品类B
      class ConcreteProductB implements Product {@Overridepublic void operation() {System.out.println("具体产品B的操作");}
      }// 抽象工厂类
      abstract class AbstractFactory {public abstract Product createProduct();
      }// 具体工厂类A
      class ConcreteFactoryA extends AbstractFactory {@Overridepublic Product createProduct() {return new ConcreteProductA();}
      }// 具体工厂类B
      class ConcreteFactoryB extends AbstractFactory {@Overridepublic Product createProduct() {return new ConcreteProductB();}
      }// 客户端代码
      public class Client {public static void main(String[] args) {AbstractFactory factoryA = new ConcreteFactoryA();Product productA = factoryA.createProduct();productA.operation();  // 输出:具体产品A的操作AbstractFactory factoryB = new ConcreteFactoryB();Product productB = factoryB.createProduct();productB.operation();  // 输出:具体产品B的操作}
      }
  • 抽象工厂模式

    • 定义:提供了一个接口用于创建一系列相关对象,而无需指定具体的实现类。

      // 抽象产品接口A
      interface AbstractProductA {void operationA();
      }// 具体产品类A1
      class ConcreteProductA1 implements AbstractProductA {@Overridepublic void operationA() {System.out.println("具体产品A1的操作");}
      }// 具体产品类A2
      class ConcreteProductA2 implements AbstractProductA {@Overridepublic void operationA() {System.out.println("具体产品A2的操作");}
      }// 抽象产品接口B
      interface AbstractProductB {void operationB();
      }// 具体产品类B1
      class ConcreteProductB1 implements AbstractProductB {@Overridepublic void operationB() {System.out.println("具体产品B1的操作");}
      }// 具体产品类B2
      class ConcreteProductB2 implements AbstractProductB {@Overridepublic void operationB() {System.out.println("具体产品B2的操作");}
      }// 抽象工厂类
      interface AbstractFactory {AbstractProductA createProductA();AbstractProductB createProductB();
      }// 具体工厂类1
      class ConcreteFactory1 implements AbstractFactory {@Overridepublic AbstractProductA createProductA() {return new ConcreteProductA1();}@Overridepublic AbstractProductB createProductB() {return new ConcreteProductB1();}
      }// 具体工厂类2
      class ConcreteFactory2 implements AbstractFactory {@Overridepublic AbstractProductA createProductA() {return new ConcreteProductA2();}@Overridepublic AbstractProductB createProductB() {return new ConcreteProductB2();}
      }// 客户端代码
      public class Client {public static void main(String[] args) {AbstractFactory factory1 = new ConcreteFactory1();AbstractProductA productA1 = factory1.createProductA();AbstractProductB productB1 = factory1.createProductB();productA1.operationA();  // 输出:具体产品A1的操作productB1.operationB();  // 输出:具体产品B1的操作AbstractFactory factory2 = new ConcreteFactory2();AbstractProductA productA2 = factory2.createProductA();AbstractProductB productB2 = factory2.createProductB();productA2.operationA();  // 输出:具体产品A2的操作productB2.operationB();  // 输出:具体产品B2的操作}
      }
  • 单例模式(*)

    image-20230626105233489

    • 概念:保证某个类有且仅有一个实例

    • 目的:保证应用只有一个全局唯一的实例,并且提供一个访问它的全局访问点

    • 饿汉式

      • 特点:在类声明时就完成了初始化
      • 优点:实现简单,执行效率高,线程安全
      • 缺点:类加载时就初始化,可能占用不必要的内存
      public class Singleton {private static Singleton instance = new Singleton();private Singleton() {}public static Singleton getInstance() {return instance;}
      }
      
    • 懒汉式

      • 特点:使用时才初始化,即懒加载
      • 优点:避免造成不必要的资源浪费
      • 缺点:使用关键词进行加锁,会影响性能
      public class Singleton {private static Singleton instance;private Singleton() {}public static synchronized Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
      }
      
    • 枚举

      public enum Singleton {INSTANCE;// 添加其他属性和方法private String name;public void setName(String name) {this.name = name;}public String getName() {return name;}
      }public class Main {public static void main(String[] args) {Singleton singleton = Singleton.INSTANCE;singleton.setName("Singleton Instance");System.out.println(singleton.getName());  // 输出:Singleton Instance}
      }
      
  • 原型模式

  • 建造者模式

结构型设计模式
  • 适配器模式

  • 桥接模式

    • 目的:将抽象部分与实现部分分离,使它们可以独立地变化。

      ​ 桥接模式通过组合关系而不是继承关系来连接抽象和实现

    • 优点:

      • 分离抽象和实现
      • 增加系统的灵活性和可扩展性
    • 缺点

      • 增加系统的复杂性和代码量
      • 系统运行速度变慢
      // 实现部分的接口
      interface Implementor {void operationImpl();
      }// 具体实现类A
      class ConcreteImplementorA implements Implementor {public void operationImpl() {System.out.println("Concrete Implementor A");}
      }// 具体实现类B
      class ConcreteImplementorB implements Implementor {public void operationImpl() {System.out.println("Concrete Implementor B");}
      }// 抽象部分的接口
      abstract class Abstraction {protected Implementor implementor;protected Abstraction(Implementor implementor) {this.implementor = implementor;}abstract void operation();
      }// 扩展抽象部分的类A
      class RefinedAbstractionA extends Abstraction {protected RefinedAbstractionA(Implementor implementor) {super(implementor);}void operation() {System.out.println("Refined Abstraction A");implementor.operationImpl();}
      }// 扩展抽象部分的类B
      class RefinedAbstractionB extends Abstraction {protected RefinedAbstractionB(Implementor implementor) {super(implementor);}void operation() {System.out.println("Refined Abstraction B");implementor.operationImpl();}
      }// 客户端代码
      public class Client {public static void main(String[] args) {Implementor implementorA = new ConcreteImplementorA();Abstraction abstractionA = new RefinedAbstractionA(implementorA);abstractionA.operation();Implementor implementorB = new ConcreteImplementorB();Abstraction abstractionB = new RefinedAbstractionB(implementorB);abstractionB.operation();}
      }
    • 适用场景

      • 避免抽象方法和其实现方法绑定在一起
      • 抽象接口和实现都需要扩展出子类以备使用
      • 变动实现的方法不会影响客户程序调用的部分
  • 组合模式

  • 装饰模式

  • 外观模式

  • 享元模式

  • 代理模式

行为型设计模式

描述算法及对象之间的任务职责分配,所描述的不仅仅是类或对象的设计模式,还有之间的通信模式。

image-20230626111259782

4.常用原则

SOLID

  • 单一责任原则
    • 单一职责原则要求类的职责单一,引起类变化的原因单一。
    • 优点:降低了类的复杂度,提高了可读性、可维护性,降低了变更引起的风险。
  • 开放封闭原则
    • 一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。
  • 里氏替换原则/迪米特法则
    • 对于里氏替换原则,所有引用基类的地方必须透明地使用其子类的对象。
    • 迪米特原则一个类应该对自己需要耦合或调用的类知道的最少
  • 接口隔离原则
    • 接口隔离原则强调接口的高内聚和低耦合,客户端不应该依赖它不需要的接口
  • 依赖倒置原则
    • 对于依赖倒置原则,要求面向对象的设计要对结构化的方法进行倒置,即高层模块不应依赖底层模块,二者都应依赖于抽象

十、Web 服务体系结构

  • 定义:通过 Web 接口提供的某个功能程序段
  • 特点:
    1. 平台无关性
    2. 通用的通信信道
    3. 企业的互操作性
    4. 功能复用
    5. 拓展业务
    6. 服务器的中立性
    7. 安全的通信
  • SOAP:简单对象访问协议
    • 定义:一种基于 XML 的协议,通过 HTTP 或其他协议在网络上进行应用程序之间的通信和信息交换
  • XML:可扩展标记语言
    • 为消息交换定义了描述和格式
  • HTTP:超文本传输协议
    • 定义了客户端和服务器之间交换的消息格式和规则,实现了从客户端请求到服务器响应的数据传输和交互过程
  • WSDL:Web 服务描述语言
    • 一种用于描述 Web 服务接口及其访问方式的 XML 文件标准

十一、基于分布构件的体系结构

EJB技术

​ EJB 是基于分布式事务吃力的企业级应用程序的组件。EJB是用于开发和部署多层结构的、分布式的、面向对象的Java应用系统的跨平台构件体系结构。

DCOM

  • DCOM是微软基于COM扩展的分布式计算技术,具有支持远程对象通信、透明性、安全性、可靠性和互操作性等特点。

CORBA

  • CORBA(Common Object Request Broker Architecture)是一种通用的对象请求代理体系结构,用于支持分布式计算环境中的对象通信和交互,具有跨平台、跨语言的特点。

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

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

相关文章

进程和ELF文件

程序的二进制格式: 关联知识:GCC编译原理与使用-CSDN博客 linux二进制程序的严格格式:ELF(Executeable and Linkable format) 一 预处理,编译,汇编得到的.o文件,就是ELF的第一种类…

Altium Designer快速入门及项目实战教程之层次原理图PCB设计(七)

一、简介 层次PCB设计是电子工程领域中一项至关重要的任务,它涉及到电路板的各个层面的功能分配和布局规划。这一设计过程的关键在于如何合理安排每一层的功能和布局,以确保电路板的性能达到最佳状态,并同时保证其可靠性。 首先&#xff0c…

数据结构 第3章:栈与队列

文章目录 1. 栈1.1 栈的基本概念1.2 栈的基本操作1.3 栈的顺序存储实现1.4 栈的链式存储实现 2. 队列2.1 队列的基本概念2.2 队列的基本操作2.3. 队列的顺序存储实现2.4 队列的链式存储实现2.5 双端队列 3. 栈与队列的应用3.1 栈在括号匹配中的应用3.2 栈在表达式求值中的应用3…

6.JavaWebJDBC连接池、JDBCTemplate

目录 导语: 一、JDBC连接池概述 常见JDBC连接池: JDBC连接池的优点 二、JDBCTemplate介绍 JDBCTemplate的核心组件 JDBCTemplate的使用方法 JDBCTemplate的优点 结语: ​​​​​​​ 导语: 在Java数据库编程中&#xf…

macOS Monterey 12.7.4 (21H1123) Boot ISO 原版可引导镜像下载

macOS Monterey 12.7.4 (21H1123) Boot ISO 原版可引导镜像下载 3 月 8 日凌晨,macOS Sonoma 14.4 发布,同时带来了 macOS Ventru 13.6.5 和 macOS Monterey 12.7.4 安全更新。 本站下载的 macOS 软件包,既可以拖拽到 Applications&#xf…

Hive-技术补充-初识ANTLR

一、背景 要清晰的理解一条Hql是如何编译成MapReduce任务的,就必须要学习ANTLR。下面是ANTLR的官方网址,下面让我们一起来跟着官网学习吧,在学习的过程中我参考了《antlr4权威指南》,你也可以读下这本书,一定会对你有…

在idea中配置tomcat服务器,部署一个项目(下载教程加链接)

第一步:把Tomcat下载好 ww​​​​​​​Apache Tomcat - Welcome! 链接如上:进去后在左边找到Tomcat8点击进去后 找到图下内容 第二步: 打开这个文件点击bin进去 会出现一个黑色框框,也就是服务器 完成后就可以在浏览器输入…

【C++】实现红黑树

目录 一、认识红黑树1.1 概念1.2 定义 二、实现红黑树2.1 插入2.2 与AVL树对比 一、认识红黑树 1.1 概念 红黑树是一个二叉搜索树,与AVL树相比,红黑树不再使用平衡因子来控制树的左右子树高度差,而是用颜色来控制平衡,颜色为红色…

Keil笔记(缘更)

Keil 一、使用Keil时可能会出现的问题1.Project框不见了2.添加文件时找不到3.交换文件位置4.main.c测试报1 warning 二、STLINK点灯操作1.配置寄存器进行点灯2.使用库函数进行点灯 3.GPIO1.LED闪烁 一、使用Keil时可能会出现的问题 1.Project框不见了 view->Project Windo…

Naive Ui Admin:企业级中后台项目开箱即用框架/让你少写一些代码

欢迎加入我们的前端组件学习交流群,可添加群主微信,审核通过后入群。 Naive Ui Admin:企业级中后台项目开箱即用框架/让你少写一些代码 在数字化时代,中后台系统对于企业的运营至关重要。然而,构建这样的系统往往需要…

Unity URP 如何写基础的曲面细分着色器

左边是默认Cube在网格模式下经过曲面细分的结果,右边是原状态。 曲面细分着色器在顶点着色器、几何着色器之后,像素着色器之前。 它的作用时根据配置信息生成额外的顶点以切割原本的面片。 关于这部分有一个详细的英文教程,感兴趣可以看一…

AtomoVideo:AIGC赋能下的电商视频动效生成

✍🏻 本文作者:凌潼、依竹、桅桔、逾溪 1. 概述 当今电商领域,内容营销的形式正日趋多样化,视频内容以其生动鲜明的视觉体验和迅捷高效的信息传播能力,为商家创造了新的机遇。消费者对视频内容的偏好驱动了视频创意供给…

Redis部署方式(三)主从模式

在前面单机版的基础上,41为主,30为从。 一、主从搭建 1、主Redis安装 41机器redis主要配置 requirepass redis#!_41 bind 0.0.0.0 port 6379 daemonize yes 2、从redis安装 30机器redis主要配置 requirepass redis#!_30 bind 0.0.0.0 port 6380 da…

python 如何使用 NLPchina 开源sql插件,提供代码

分享一段使用python,通过使用发送post请求的方式,来从es集群中获取数据。不用使用 elasticsearh,仅需要导入request和json包即可。 开源sql插件官方 文档 GitHub - NLPchina/elasticsearch-sql: Use SQL to query Elasticsearch 示例代码 调…

JavaScript中的事件模型(详细案例代码)

文章目录 一、事件与事件流二、事件模型原始事件模型特性 标准事件模型特性 IE事件模型 一、事件与事件流 javascript中的事件,可以理解就是在HTML文档或者浏览器中发生的一种交互操作,使得网页具备互动性, 常见的有加载事件、鼠标事件、自定…

js实现扫描线填色算法使用canvas展示

算法原理 扫描线填色算法的基本思想是:用水平扫描线从上到下扫描由点线段构成的多段构成的多边形。每根扫描线与多边形各边产生一系列交点。将这些交点按照x坐标进行分类,将分类后的交点成对取出,作为两个端点,以所填的色彩画水平…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《适应分布式资源渗透率提高的配电网网元规划方法》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

【QT 5 +Linux下qt软件点击.sh脚本运行+Dconf编辑器+学习他人文章+番外篇:点击脚本运行软件】

【QT 5 Linux下qt软件点击.sh脚本运行Dconf编辑器学习他人文章番外篇:点击脚本运行软件】 1、前言2、实验环境3、自我学习总结-本篇总结1、说明:代替qt的快捷方式2、适用性更广3、了解工具:Dconf编辑器注意事项: 4、参考链接-感谢…

PCM和I2S区别

I2S和PCM接口都是数字音频接口,而所见的蓝牙到cpu以及codec的音频接口都是用PCM接口,是不是两个接口有各自不同的应用呢?先来看下概念。 PCM(PCM-clock、PCM-sync、PCM-in、PCM-out)脉冲编码调制,模拟语音信…

基础:TCP是什么?

1. TCP 是什么? TCP(Transmission Control Protocol 传输控制协议) 是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793 [1]定义。 TCP旨在适应支持多网络应用的分层协议层次结构。连接到不同但互连的计算机…