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

【设计模式】3、builder 建造者模式

文章目录

  • 三、builder 模式(生成器)
    • 3.1 build 房屋
      • 3.1.1 builder.go
      • 3.1.2 director.go
      • 3.1.3 director_test.go
      • 3.1.4 house.go
      • 3.1.5 igloo_builder.go
      • 3.1.6 normal_builder.go
        • 3.1.7 测试
    • 3.2 option
      • 3.2.1 pool_test.go
      • 3.3.2 pool.go
      • 3.3.3 option.go
    • 3.3 自行车加工
      • 3.3.1 目录层级
      • 3.3.2 bicycle_builder
      • 3.3.3 mountain_bicycle_builder
      • 3.3.4 road_bicycle_builder
      • 3.3.5 director
      • 3.3.6 bicycle
      • 3.3.7 main

三、builder 模式(生成器)

https://refactoringguru.cn/design-patterns/builder# 需求
1. 如果需要构造的产品, 可能有很多种类, 则构造函数需要很多参数.
但如果实际每种产品只需要部分参数, 那么就会出现冗长的参数列表, 难以使用.# 方案
builder 模式, 把产品的构造代码, 单独放在一个名为 builder 的独立对象中.该模式, 将对象的构建, 拆分为若干步骤.每次创建对象时, 都通过 builder 对象执行其中的部分步骤.## builder 是接口
如果希望生成多种类似的产品, 则希望 builder 是接口## 可选的 director(主管)
client 可以直接使用 builder, 也可以借助 director (让 director 封装 builder 的各种快捷操作)

目录层级如下:

03builder
├── 031house
│   ├── builder.go
│   ├── director.go
│   ├── director_test.go
│   ├── house.go
│   ├── igloo_builder.go
│   ├── normal_builder.go
│   └── readme.md
└── readme.md

3.1 build 房屋

# 示例
参考: https://refactoringguru.cn/design-patterns/builder/go/example
需求: build 各种房屋: 如 冰屋, 或普通房屋1. 抽象 build 过程中的相似步骤: 因为各种房屋的 build 流程是相似的, 则可以抽象出 [相似的步骤].
2. 定义 builder 接口: 把这些 [相似的步骤] 放在 builder 接口中.
3. 实现 builder 接口: 然后, [builder 接口] 可以有多种实现, 比如 [冰屋 builder 实现], 或 [普通房屋 builder 实现].
4. builder 提供获取产品的方法: 因为 [各种 builder 的实现] 构建出的产品, 并不一定是符合相同接口的, 所以, 每种 builder 可以获取自己的构建的产品结果.
5. (可选) 定义 director, 封装 builder 的常见操作: 因为 builder 的步骤很多, 为了方便 client 的使用, 可以把常见操作封装在 director 中. (即把复杂封装在 director, 把简单留给 client)
6. client 使用: client 可以使用 director, 或者使用 builder, 构建产品, 并获取产品.具体详见本文件夹的代码

3.1.1 builder.go

package _31buildertype builder interface {// SetWindowType 步骤: 设置窗户SetWindowType()// SetDoorType 步骤: 设置门SetDoorType()// SetNumFloor 步骤: 设置楼层SetNumFloor()// GetHouse 结果: 获取建造出的房屋GetHouse() house// Reset 清空构造器的所有步骤, 以备后续建造Reset()
}

3.1.2 director.go

package _31builder// director 主管, 封装了常见的 builder 流程, 方便 client 使用
type director struct {// builder 封装的建造者builder builder
}// NewDirector 新建主管
func NewDirector(b builder) *director {return &director{builder: b,}
}// SetBuilder 给 Director 切换 builder
func (d *director) SetBuilder(b builder) {d.builder = b
}// BuildHouse 真正封装的行为: 使用 builder 建造房屋
func (d *director) BuildHouse() house {b := d.builder// 执行 builder 的各步骤b.SetWindowType()b.SetDoorType()b.SetNumFloor()// 获取 build 的结果hs := b.GetHouse()// 清空已执行的步骤, 以备后续 build 新产品b.Reset()return hs
}

3.1.3 director_test.go

package _31builderimport ("github.com/stretchr/testify/require""testing"
)// 使用 director 构建房屋
func TestDirectorBuildHouse(t *testing.T) {iglooBuilder := NewIglooBuilder()director := NewDirector(iglooBuilder)iglooHouse := director.BuildHouse()require.EqualValues(t, "冰窗", iglooHouse.windowType)require.EqualValues(t, "冰门", iglooHouse.doorType)require.EqualValues(t, 1, iglooHouse.numFloor)normalBuilder := NewNormalBuilder()director.SetBuilder(normalBuilder)normalHouse := director.BuildHouse()require.EqualValues(t, "落地窗", normalHouse.windowType)require.EqualValues(t, "防盗门", normalHouse.doorType)require.EqualValues(t, 10, normalHouse.numFloor)
}

3.1.4 house.go

package _31builder// 建造出的房屋产品
type house struct {windowType stringdoorType   stringnumFloor   int
}

3.1.5 igloo_builder.go

package _31builder// iglooBuilder 冰屋建造者
type iglooBuilder struct {windowType stringdoorType   stringnumFloor   int// 建造的结果house house
}// NewIglooBuilder 构造 iglooBuilder, 返回接口, 以便调用者(如 director)切换不同的 builder 实现
func NewIglooBuilder() builder {return &iglooBuilder{windowType: "",doorType:   "",numFloor:   0,house:      house{},}
}func (b *iglooBuilder) SetWindowType() {b.windowType = "冰窗"
}func (b *iglooBuilder) SetDoorType() {b.doorType = "冰门"
}func (b *iglooBuilder) SetNumFloor() {b.numFloor = 1
}func (b *iglooBuilder) GetHouse() house {return house{windowType: b.windowType,doorType:   b.doorType,numFloor:   b.numFloor,}
}func (b *iglooBuilder) Reset() {b.windowType = ""b.doorType = ""b.numFloor = 0b.house = house{}
}

3.1.6 normal_builder.go

package _31builder// normalBuilder 普通房屋建造者
type normalBuilder struct {windowType stringdoorType   stringnumFloor   int// 建造的结果house house
}// NewNormalBuilder 构造 normalBuilder, 返回 builder 接口, 方便调用者切换不同的 builder 实现
func NewNormalBuilder() builder {return &normalBuilder{windowType: "",doorType:   "",numFloor:   0,house:      house{},}
}func (b *normalBuilder) SetWindowType() {b.windowType = "落地窗"
}func (b *normalBuilder) SetDoorType() {b.doorType = "防盗门"
}func (b *normalBuilder) SetNumFloor() {b.numFloor = 10
}func (b *normalBuilder) GetHouse() house {return house{windowType: b.windowType,doorType:   b.doorType,numFloor:   b.numFloor,}
}func (b *normalBuilder) Reset() {b.windowType = ""b.doorType = ""b.numFloor = 0b.house = house{}
}
3.1.7 测试
go test -v ./03builder/...
=== RUN   TestDirectorBuildHouse
--- PASS: TestDirectorBuildHouse (0.00s)
PASS
ok      godp/03builder/031house 0.111s

3.2 option

需求: 实现连接池, 其有若干参数, 如最大连接数, 最大空闲连接数, 是否打印 sql 等

如果希望用户可以传入可选的参数, 覆盖默认的参数, 则可以用 builder 模式, 实现链式的调用

目录层级:

03builder/032conn_pool
├── option.go
├── pool.go
├── pool_test.go
└── readme.md

3.2.1 pool_test.go

package _32conn_poolimport ("github.com/stretchr/testify/require""testing"
)// 直接方式, 需 client 手动创建 option
func TestNewPoolDirectly(t *testing.T) {// 支持默认行为pDefault := NewPool()require.EqualValues(t, defaultMaxConn, pDefault.MaxConn)require.EqualValues(t, defaultMaxIdleConn, pDefault.MaxIdleConn)require.EqualValues(t, defaultShowSQL, pDefault.ShowSQL)// 支持自定义行为, 初始化时调用expectMaxConn := 8expectMaxIdleConn := 6expectShowSQL := trueopts := []poolOpt{func(p *pool) { p.MaxConn = expectMaxConn },func(p *pool) { p.MaxIdleConn = expectMaxIdleConn },func(p *pool) { p.ShowSQL = expectShowSQL },}p := NewPool(opts...)require.EqualValues(t, expectMaxConn, p.MaxConn)require.EqualValues(t, expectMaxIdleConn, p.MaxIdleConn)require.EqualValues(t, expectShowSQL, p.ShowSQL)// 支持自定义行为, 初始化时调用, 且后续继续调用expectMaxConn = 7expectMaxIdleConn = 4expectShowSQL = truep1 := NewPool(func(p *pool) { p.MaxConn = expectMaxConn }, func(p *pool) { p.MaxIdleConn = expectMaxIdleConn }).WithOpts(func(p *pool) { p.MaxIdleConn = expectMaxIdleConn },func(p *pool) { p.ShowSQL = expectShowSQL },)require.EqualValues(t, expectMaxConn, p1.MaxConn)require.EqualValues(t, expectMaxIdleConn, p1.MaxIdleConn)require.EqualValues(t, expectShowSQL, p1.ShowSQL)
}// 简易方式, 封装常见步骤, 并链式调用各步骤
func TestNewPoolEasy(t *testing.T) {// 支持默认行为pDefault := NewPool()require.EqualValues(t, defaultMaxConn, pDefault.MaxConn)require.EqualValues(t, defaultMaxIdleConn, pDefault.MaxIdleConn)require.EqualValues(t, defaultShowSQL, pDefault.ShowSQL)// 支持自定义行为p := NewPool().setMaxConn(8).setMaxIdleConn(6).setShowSQL(true)require.EqualValues(t, 8, p.MaxConn)require.EqualValues(t, 6, p.MaxIdleConn)require.EqualValues(t, true, p.ShowSQL)
}

3.3.2 pool.go

package _32conn_pool// 定义 产品, 即连接池 pool
type pool struct {// 最大连接数MaxConn int// 最大空闲连接MaxIdleConn int// 打印 SQLShowSQL bool
}const (defaultMaxConn     = 10defaultMaxIdleConn = 5defaultShowSQL     = false
)// NewPool 构造 pool
// 因为 opts 是可选的参数(即 ... 的), 如果未传入则期望默认行为, 如果传入则期望覆盖部分默认行为
func NewPool(opts ...poolOpt) *pool {// 默认连接池p := &pool{MaxConn:     defaultMaxConn,MaxIdleConn: defaultMaxIdleConn,ShowSQL:     defaultShowSQL,}// 应用传入的选项, 覆盖默认的参数for _, opt := range opts {opt(p)}// 返回构造的连接池return p
}func (p *pool) WithOpts(opts ...poolOpt) *pool {for _, opt := range opts {opt(p)}return p
}// 封装常见步骤
func (p *pool) setMaxConn(n int) *pool {p.MaxConn = nreturn p
}func (p *pool) setMaxIdleConn(n int) *pool {p.MaxIdleConn = nreturn p
}func (p *pool) setShowSQL(s bool) *pool {p.ShowSQL = sreturn p
}

3.3.3 option.go

package _32conn_pool// 定义 option 函数, 其会被传入 产品的构造函数, 用于改变产品的默认参数
// 该函数的输入是 pool 指针
// 函数内部, 会改变 pool 指针的某些参数
// 该函数没有输出值
type poolOpt func(p *pool)

3.3 自行车加工

https://kamacoder.com/problempage.php?pid=1084

题目描述
小明家新开了一家自行车工厂,用于使用自行车配件(车架 frame 和车轮 tires )进行组装定制不同的自行车,包括山地车和公路车。山地车使用的是Aluminum Frame(铝制车架)和 Knobby Tires(可抓地轮胎),公路车使用的是 Carbon Frame (碳车架)和 Slim Tries。现在它收到了一笔订单,要求定制一批自行车,请你使用【建造者模式】告诉小明这笔订单需要使用那些自行车配置吧。输入描述
输入的第一行是一个整数 N(1 ≤ N ≤ 100),表示订单的数量。 接下来的 N 行,每行输入一个字符串,字符串表示客户的自行车需求。字符串可以包含关键词 "mountain""road",表示客户需要山地自行车或公路自行车。输出描述
对于每笔订单,输出该订单定制的自行车配置。
输入示例
3
mountain
road
mountain输出示例
Aluminum Frame Knobby Tires
Carbon Frame Slim Tires
Aluminum Frame Knobby Tires提示信息
在本例中:产品为自行车,可以有两个建造者:山地车建造者和公路车建造者。

3.3.1 目录层级

├── bicycle.go
├── bicycle_builder.go
├── director.go
├── main.go
├── mountain_bicycle_builder.go
├── readme.md
└── road_bicycle_builder.go

3.3.2 bicycle_builder

package main// BicycleBuilder 自行车建造者, 通用接口
type BicycleBuilder interface {// 构建车架buildFrame()// 构建轮胎buildTrie()// 获取构建的结果getBicycle() bicycle// 重置reset()
}

3.3.3 mountain_bicycle_builder

package main// 山地车建造者, 具体实现
type mountainBicycleBuilder struct {// 构建出的产品: 山地车mountainBicycle bicycle
}func NewMountainBicycleBuilder() *mountainBicycleBuilder {return &mountainBicycleBuilder{}
}// 山地车建造者, 建造车架实现
func (b *mountainBicycleBuilder) buildFrame() {b.mountainBicycle.frame = "Aluminum Frame"
}// 山地车建造者, 建造轮胎实现
func (b *mountainBicycleBuilder) buildTrie() {b.mountainBicycle.trie = "Knobby Tires"
}func (b *mountainBicycleBuilder) getBicycle() bicycle {return b.mountainBicycle
}func (b *mountainBicycleBuilder) reset() {b.mountainBicycle = bicycle{}
}

3.3.4 road_bicycle_builder

package main// 公路车建造者, 具体实现
type roadBicycleBuilder struct {// 构建出的产品: 公路车roadBicycle bicycle
}func NewRoadBicycleBuilder() *roadBicycleBuilder {return &roadBicycleBuilder{}
}// 公路车建造者, 建造车架, 具体实现
func (b *roadBicycleBuilder) buildFrame() {b.roadBicycle.frame = "Carbon Frame"
}// 公路车建造者, 建造轮胎, 具体实现
func (b *roadBicycleBuilder) buildTrie() {b.roadBicycle.trie = "Slim Tires"
}// 获取构建的产品: 公路车
func (b *roadBicycleBuilder) getBicycle() bicycle {return b.roadBicycle
}func (b *roadBicycleBuilder) reset() {b.roadBicycle = bicycle{}
}

3.3.5 director

package maintype Director struct {builder BicycleBuilder
}func NewDirector() *Director {return &Director{builder: nil}
}func (d *Director) BuildBicycle() bicycle {d.builder.buildFrame()d.builder.buildTrie()bi := d.builder.getBicycle()d.builder.reset()return bi
}func (d *Director) setBuilder(b BicycleBuilder) {d.builder = b
}

3.3.6 bicycle

package mainimport "fmt"// 公路车, 产品
type bicycle struct {// 车架frame string// 轮胎trie string
}// 打印 公路车的信息
func (r *bicycle) info() string {return fmt.Sprintf("%v %v", r.frame, r.trie)
}

3.3.7 main

package mainimport ("bufio""fmt""os""strconv"
)/*
// 运行
go run .// 输入
3
mountain
road
mountain// 输出
Aluminum Frame Knobby Tires
Carbon Frame Slim Tires
Aluminum Frame Knobby Tires
*/
func main() {scanner := bufio.NewScanner(os.Stdin)scanner.Scan()n, _ := strconv.Atoi(scanner.Text())for i := 0; i < n; i++ {scanner.Scan()bicycleType := scanner.Text()var builder BicycleBuilderswitch bicycleType {case "mountain":builder = NewMountainBicycleBuilder()case "road":builder = NewRoadBicycleBuilder()default:continue}d := NewDirector()d.setBuilder(builder)bi := d.BuildBicycle()fmt.Println(bi.info())}
}

相关文章:

【设计模式】3、builder 建造者模式

文章目录 三、builder 模式&#xff08;生成器&#xff09;3.1 build 房屋3.1.1 builder.go3.1.2 director.go3.1.3 director_test.go3.1.4 house.go3.1.5 igloo_builder.go3.1.6 normal_builder.go3.1.7 测试 3.2 option3.2.1 pool_test.go3.3.2 pool.go3.3.3 option.go 3.3 自…...

使用ROCm的HIP API向量加法程序

一、向量加法程序 Radeon Open Compute (ROCm) 是一个开源平台&#xff0c;用于加速高性能计算 (HPC) 和机器学习应用程序。它支持包括GPUs在内的多种硬件&#xff0c;并提供HIP (Heterogeneous-compute Interface for Portability) 作为CUDA代码的便捷转换工具。为了提供一个…...

Vue3---基础7(Props)

props&#xff0c;用于给子组件传递父组件的值的方法 代码示例&#xff1a; 父组件 <template><Text1 :list"personList"/> </template><script lang"ts" setup namae"App">import Text1 from ./components/text2.vu…...

第一节:什么是操作系统

什么是操作系统 一、一台计算机的组成部分1、计算机能干啥2、谈谈计算机硬件 二、什么是操作系统三、学习操作系统的层次 一、一台计算机的组成部分 如下图所示&#xff1a; 这就是就是构成一台计算机的组成部分 1、计算机能干啥 ∙ \bullet ∙计算机是我们专业吃饭的家伙&a…...

Day:007(1) | Python爬虫:高效数据抓取的编程技术(scrapy框架使用)

Scrapy的介绍 Scrapy 是一个用于抓取网站和提取结构化数据的应用程序框架&#xff0c;可用于各种有用的应用程序&#xff0c;如数据挖掘、信息处理或历史存档。 尽管 Scrapy 最初是为网络抓取而设计的&#xff0c;但它也可用于使用API提取数据或用作通用网络爬虫。 Scrapy的优势…...

Echarts使用dataTool写可自定义横坐标的盒须图(箱线图)

在vue2中的完整盒须图组件代码 可自适应浏览器窗体变化&#xff0c;可自定义横坐标&#xff0c;无需写箱线图数据处理逻辑。dataTool是echarts自带的&#xff0c;无需额外安装&#xff0c;只要引入。 <template><span><div ref"BoxPlotChart" id&qu…...

SpringBoot编写一个SpringTask定时任务的方法

1&#xff0c;在启动类上添加注解 EnableScheduling//开启定时任务调度 2&#xff0c; 任务&#xff08;方法&#xff09;上也要添加注解&#xff1a; Scheduled(cron " 0 * * * * ? ") //每分钟执行一次 域&#xff1a; 秒 分 时 日 月 周 &#xff08;年&#…...

【Qt编译】ARM环境 Qt5.14.2-QtWebEngine库编译 (完整版)

ARM 编译Qt5.14.2源码 1.下载源码 下载Qt5.14.2源代码&#xff08;可根据自己的需求下载不同版本&#xff09; 下载网站&#xff1a;https://download.qt.io/new_archive/qt/5.14/5.14.2/single/ 2.相关依赖(如果需要的话) 先参考官方文档的需求进行安装&#xff1a; 官方…...

vue简单使用二(循环)

目录 属性绑定 if判断&#xff1a; for循环&#xff1a; 属性绑定 代码的形式来说明 三元表达式的写法&#xff1a; if判断&#xff1a; for循环&#xff1a; 完整代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"…...

JavaScript入门--变量

JavaScript入门--变量 一、JS变量二、变量命名三、常量四、局部变量 一、JS变量 定义变量a, b, c&#xff0c;并输出到控制台。 var a 1; var b 13.14; var c hello Js;console.log(a, b, c) //console.log()语句用于输出结果到控制台&#xff0c;类似python的print语句…...

给自己的机器人部件安装单目摄像头并实现gazebo仿真功能

手术执行器添加摄像头 手术执行器文件夹surgical_new内容展示如何添加单目摄像头下载现成的机器人环境文件启动仿真环境 手术执行器文件夹surgical_new内容展示 进入src文件夹下选择进入vision_obliquity文件夹 选择launch 有两个可用gazebo中rviz展示的launch文件&#xff0…...

用AI的视角看世界

前言 2024年将是Ai人工智能在各个行业垂直领域发展的元年。 随着2022年11月openai 的大语言模型chatgpt3.5的诞生&#xff0c;已经预示着互联网时代&#xff0c;移动互联网时代即将迎来新的变革&#xff0c;也预示着web3.0和元宇宙更近了一步。 回顾历史&#xff0c;互联网的…...

MATLAB 自定义实现点云法向量和曲率计算(详细解读)(64)

MATLAB 自定义实现点云法向量和曲率计算(详细解读)(64) 一、算法介绍二、算法步骤三、算法实现1.代码 (完整,注释清晰,可直接用)2.结果一、算法介绍 首先说明: ------这里代码手动实现,不调用matlab提供的法向量计算接口,更有助于大家了解法向量和曲率的计算方法,…...

拯救鲨鱼!Helping wireshark!wireshark未响应解决方法

前言 做题的的时候 在用wireshark解密tls秘钥的时候 我的小鲨鱼突然未响应了 然后我多次尝试无果 并且殃及池鱼 我电脑上所有的流量包都打不开了&#xff1f;&#xff01;&#xff01;&#xff01; 于是乎 尝试删了重下 还是未响应 开始怀疑电脑 重启电脑两次 还是打…...

设计模式之责任链讲解

责任链模式适用于需要将请求和处理解耦的场景&#xff0c;同时又需要动态地组织处理逻辑的场景。 通过使用责任链模式&#xff0c;可以实现请求的动态处理、灵活的扩展和简化的代码编写&#xff0c;提高系统的可维护性和可扩展性。 一、责任链入门 以下这是GPT生成的责任链代…...

K8s: 将一个节点移出集群和相关注意事项

前置步骤 在Kubernetes集群中&#xff0c;要移出一个节点&#xff0c;你需要执行以下步骤&#xff1a; 1 &#xff09;将节点标记为不可调度 首先&#xff0c;你需要将目标节点标记为不可调度&#xff0c;以确保Kubernetes不会在该节点上调度新的Pod这可以通过执行以下命令实…...

Python学习笔记24 - 学生信息管理系统

1. 需求分析 2. 系统设计 3. 系统开发必备 4. 主函数设计 5. 学生信息维护模块设计 a. 录入学生信息 b. 删除学生信息 c. 修改学生信息 d. 查询学生信息 e. 统计学生总人数 f. 显示所有学生信息 g. 排序模块设计 6. 项目打包...

【物联网应用案例】某制造企业电锅炉检测项目

供暖行业在我国的经济发展中占据着重要的地位&#xff0c;然而&#xff0c;长期以来&#xff0c;该行业存在着自动化水平低、管理效率不高等问题&#xff0c;制约了其持续发展。为了解决这些问题&#xff0c;吉林某电锅炉生产厂家进行了一项创新性的尝试。 该厂家通过集成物联…...

设计模式实践

结合设计模式概念和在java/spring/spring boot中的实战&#xff0c;说明下列设计模式。 一、工厂模式 这里只讲简单工厂模式&#xff0c;详细的可以参考Java工厂模式&#xff08;随笔&#xff09;-CSDN博客。工厂类会根据不同的参数或条件来决定创建哪种对象&#xff0c;这样…...

嵌入式学习52-ARM1

知识零散&#xff1a; 1.flash&#xff1a; nor flash 可被寻地址 …...

Java(MySQL基础)

数据库相关概念 MySOL数据库 关系型数据库(RDBMS) 概念: 建立在关系模型基础上&#xff0c;由多张相互连接的二维表组成的数据库。特点: 使用表存储数据&#xff0c;格式统一&#xff0c;便于维护使用SQL语言操作&#xff0c;标准统一&#xff0c;使用方便 SQL SOL通用语法…...

预约系统的使用

预约系统的使用 目录概述需求&#xff1a; 设计思路实现思路分析1.用户年规则 在 预约系统中的使用流程 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wa…...

酷开科技OTT大屏营销:开启新时代的营销革命

随着互联网技术的不断发展和普及&#xff0c;大屏已经成为越来越多家庭选择的娱乐方式。在这个背景下&#xff0c;酷开科技凭借其强大的技术实力和敏锐的市场洞察力&#xff0c;成功地将大屏转化为一种新的营销渠道&#xff0c;为品牌和企业带来了前所未有的商业机会。 酷开科技…...

网络安全(防火墙,IDS,IPS概述)

问题一:什么是防火墙,IDS,IPS? 防火墙是对IP:port的访问进行限制,对访问端口进行制定的策略去允许开放的访问,将不放开的端口进行拒绝访问,从而达到充当防DDOS的设备。主要是拒绝网络流量,阻断所有不希望出现的流程,禁止数据流量流通,达到安全防护的作用。如将一些恶…...

安装IntelliJ IDEA插件教程

安装IntelliJ IDEA插件&#xff1a;一份详细指南 在提升IntelliJ IDEA开发效率的过程中&#xff0c;插件扮演着不可或缺的角色。它们为IDE提供了额外的功能和工具&#xff0c;以满足开发者在特定编程语言、框架、测试、版本控制等方面的个性化需求。本文将为您详细阐述如何在I…...

大厂基础面试题(之四)

Q1&#xff1a;请先进行自我介绍 Q2&#xff1a;说下你学习前端的详细过程 Q3&#xff1a;一个页面从url输入到显示页面的整个过程 1.URL解析 2.DNS解析 3.建立TCP连接 4.发起HTTP请求 5.服务器处理请求 6.返回HTTP响应 7.下载页面资源 8.解析和渲染页面 9.JavaScript执行 10…...

为什么我们应该切换到Rust

What is RUST? 什么是Rust&#xff1f; Rust is a programming language focused on safety, particularly safe concurrency, supporting functional and imperative-procedural paradigms. Rust is syntactically similar to C, but it provides memory safety without usi…...

基于Linux定时任务实现的MySQL周期性备份

1、创建备份目录 sudo mkdir -p /var/backups/mysql/database_name2、创建备份脚本 sudo touch /var/backups/mysql/mysqldump.sh# 用VIM编辑脚本文件&#xff0c;写入备份命令 sudo vim /var/backups/mysql/mysqldump.sh# 内如如下 #!/bin/bash mysqldump -uroot --single-…...

【Altium Designer 20 笔记】隐藏PCB上的信号线(连接线)

使用网络类隐藏特定类型的信号线 如果你想要隐藏特定类型的信号线&#xff08;例如电源类&#xff09;&#xff0c;你可以首先创建一个网络类。使用快捷键DC调出对象类浏览器&#xff0c;在Net Classes中右击添加类&#xff0c;并重命名&#xff08;例如为“Power”&#xff0…...

【Git教程】(九)版本标签 —— 创建、查看标签,标签的散列值,将标签添加到日志输出中,判断标签是否包含特定的提交 ~

Git教程 版本标签&#xff08;tag&#xff09; 1️⃣ 创建标签2️⃣ 查看存在的标签3️⃣ 标签的散列值4️⃣ 将标签添加到日志输出中5️⃣ 判断tag是否包含特定的提交&#x1f33e; 总结 大多数项目都是用 1.7.3.2和 “ gingerbread” 这样的数字或名称来标识软件版本的。在 …...

哪个网站做3d模型/b2b免费推广网站

为什么80%的码农都做不了架构师&#xff1f;>>> 计算机网络知识 讲述计算机网络的最经典的当属Andrew S&#xff0e;Tanenbaum的《计算机网络》第五版&#xff0c;这本书难易适中。 目前已经是第五版&#xff0c;本书作者80年代就开发出MINIX&#xff0c;是一个用于…...

erp二次开发好还是网站开发好/合肥关键词排名优化

前言 亲爱的各位Android程序员&#xff0c;您们好&#xff1a; 我理解您们的焦虑和困惑&#xff0c;但我想告诉您的是&#xff1a;作为一名Android程序员&#xff0c;您依然是非常有前途和市场需求的职业人才。 首先&#xff0c;您要知道&#xff0c;移动互联网时代的普及率…...

关于免费制作网页的网站/百度域名购买

1、添加用户&#xff0c;首先用adduser命令添加一个普通用户&#xff0c;命令如下&#xff1a; #adduser tommy //添加一个名为tommy的用户 #passwd tommy //修改密码 Changing password for user tommy. New UNIX password: //在这里输入新密码 Retype new UNIX password: //再…...

室内装饰设计师证书/seo专员岗位要求

UITextField属性 0. enablesReturnKeyAutomatically 默认为No,如果设置为Yes,文本框中没有输入任何字符的话&#xff0c;右下角的返回按钮是disabled的。 1.borderStyle 设置边框样式&#xff0c;只有设置了才会显示边框样式  text.borderStyle UITextBorderStyleRounded…...

如何制作公司内部网页/公司网站seo外包

本文以内部函数为主线&#xff0c;深入讲解内部函数和闭包的应用场景和原理&#xff0c;学会后你的Python水平会再上一个台阶&#xff0c;对工作面试或实战应用都会很有帮助。本文包括&#xff1a;函数是一等公民内部函数定义闭包和nonlocal关键词应用场景 - 封装应用场景 - 函…...

哈尔滨微网站建设/sem和seo是什么职业岗位

C语言中&#xff0c;所有的指针都必须进行初始化&#xff0c;包括结构体中的成员&#xff01; 代码如下&#xff1a; #include <stdio.h> #include <stdlib.h> #include <string.h> struct student{ char *name; int score; struct stu…...