- 博客(49)
- 收藏
- 关注
原创 11_代理模式
代理模式摘要 代理模式是一种结构型设计模式,通过创建代理对象来控制对真实对象的访问。它包含三个核心角色:抽象主题接口、真实主题实现类和代理类。代理模式适用于需要添加访问控制、延迟加载或远程访问等场景。 实现方式上,代理类持有真实对象的引用,并在转发请求前后插入额外逻辑(如权限检查、日志记录)。该模式遵循开闭原则,能在不修改真实对象的情况下扩展功能。 主要优点包括解耦客户端与真实对象、实现延迟加载和访问控制;缺点是增加了系统复杂度,可能影响性能。代码示例展示了代理如何包装真实对象,在请求处理前后添加额外操作。
2026-04-10 09:00:00
6
原创 12_外观模式
外观模式是一种结构型设计模式,它为复杂子系统提供统一的高层接口,简化客户端调用。该模式包含外观类(提供统一接口)和子系统类(实现具体功能),通过外观类将客户端请求委派给子系统处理。主要优点包括降低系统耦合度、简化客户端调用、隐藏实现细节;缺点可能造成外观类过于复杂,且子系统变更需修改外观类。适用于需要为复杂系统提供简单接口、减少系统耦合度的场景。
2026-04-10 09:00:00
7
原创 09_适配器模式
适配器模式是一种结构型设计模式,用于解决接口不兼容问题。它通过转换接口使原本不兼容的类能够协同工作,主要有类适配器(继承实现)和对象适配器(组合实现)两种方式。该模式适用于复用现有类但接口不匹配的场景,优点包括提高系统扩展性和代码复用性,缺点可能增加系统复杂度和耦合度。代码示例展示了两种适配器实现方式,通过将Adaptee的specificRequest()适配为Target的request()接口。
2026-04-09 09:00:00
292
原创 10_装饰器模式
装饰器模式是一种动态扩展对象功能的结构型设计模式,允许在不修改原有对象的情况下添加额外职责。通过组合而非继承实现功能扩展,包含组件、具体组件、装饰器和具体装饰器等角色。UML结构展示了装饰器与组件的聚合关系及多级嵌套能力。代码示例演示了如何通过装饰器层层包装组件对象。该模式的优点包括动态扩展、避免继承爆炸、符合开放封闭原则,但可能增加系统复杂性并使代码难以理解。适用于需要灵活添加或移除对象功能的场景。
2026-04-09 09:00:00
262
原创 07_建造者模式
建造者模式是一种创建型设计模式,用于分离复杂对象的构建过程和表示。它适用于创建具有复杂内部结构或多属性的对象,通过抽象建造者定义接口,具体建造者实现构建逻辑,指挥者控制构建顺序。UML图展示了产品、建造者和指挥者之间的关系。代码示例演示了如何使用C++实现建造者模式,创建不同表示的产品。优点是构建与表示分离、控制精细、符合单一职责原则;缺点是增加系统复杂度,产品结构变化时需修改所有建造者类。
2026-04-08 09:00:00
225
原创 08_原型模式
摘要:原型模式是一种通过复制现有对象来创建新对象的设计模式,避免了复杂的实例化过程。它适用于创建成本高或与现有对象相似的新对象场景。实现包含原型接口、具体原型类和客户端三个角色,通过clone()方法复制对象。该模式优点是快速创建、动态增减对象,缺点是实现复杂且可能引发循环引用问题。代码示例展示了C++中如何实现原型模式。
2026-04-08 09:00:00
204
原创 05_抽象工厂模式
抽象工厂模式是一种创建型设计模式,用于创建相关对象的家族而不指定具体类。它包含抽象产品、具体产品、抽象工厂和具体工厂等角色,通过工厂接口创建相互兼容的产品系列。该模式优点在于实现产品族创建与使用的分离,保证产品兼容性,但添加新产品类型时需要修改所有工厂实现,增加了系统复杂性。代码示例展示了如何通过抽象工厂创建不同系列的产品对象,如ProductA1/B1和ProductA2/B2,这些产品由各自的工厂类(ConcreteFactory1/2)创建,确保同一工厂创建的产品能够协同工作。
2026-04-07 09:00:00
322
原创 06_单例模式
单例模式是一种确保类仅有一个实例的设计模式,提供全局访问点。适用于需要唯一实例协调组件、控制资源访问或避免高成本重复创建的场景。常见实现方式包括饿汉式、懒汉式、双重检查锁定、静态内部类等。代码示例展示了使用C++11 std::call_once的线程安全实现。该模式优点是确保唯一实例和全局访问,但缺点是增加耦合度、测试困难及可能的内存泄漏问题。
2026-04-07 09:00:00
352
原创 04_工厂方法模式
工厂方法模式是一种创建型设计模式,通过定义创建对象的接口让子类决定实例化哪个类。该模式包含产品接口、具体产品、工厂接口和具体工厂四个角色,实现了对象创建和使用的分离,符合开放封闭原则。主要优点包括解耦对象创建和使用、便于扩展新产品类型,但也存在增加代码复杂性和客户端需知晓具体工厂类型的缺点。适用于需要灵活创建对象或希望将创建过程委托给子类的场景,如示例代码展示了通过不同工厂创建不同类型产品的实现方式。
2026-04-06 12:06:16
197
原创 03_简单工厂模式
简单工厂模式是一种创建型设计模式,通过工厂类集中管理对象创建逻辑,使客户端无需了解具体实现细节。该模式包含产品接口、具体产品和工厂类三个角色,适用于对象类型较少且稳定的场景。优点是实现创建与使用分离,缺点是工厂类职责过重,添加新产品需修改工厂代码,违反开放封闭原则。示例代码展示了如何通过工厂类创建不同产品实例。
2026-04-06 12:05:14
198
原创 02_设计模式最佳实践
本文系统介绍了23种常用设计模式的选择原则、应用场景和实现建议,包括创建型、结构型和行为型三大类。文章强调应根据具体问题选择合适的设计模式,考虑系统可扩展性、性能和团队熟悉度,避免过度设计和机械应用。通过配置管理、排序算法和事件系统等实际案例,展示了单例模式、策略模式和观察者模式的具体应用。同时指出了过度使用设计模式、机械应用、忽略变体、不考虑性能和团队熟悉度等常见误区。设计模式是提高代码质量和可维护性的重要工具,但需合理运用才能发挥其真正价值。
2026-04-05 16:28:02
379
原创 01_设计模式概述
设计模式是软件开发中针对常见问题的可重用解决方案,分为创建型、结构型和行为型三大类。创建型模式处理对象创建(如工厂、单例模式),结构型模式处理对象组合(如适配器、装饰器模式),行为型模式处理对象交互(如观察者、策略模式)。设计模式能提高代码重用性、可维护性和可扩展性,促进团队协作。应用时应避免过度设计,理解模式意图,灵活选择合适模式。掌握设计模式有助于开发更优雅高效的软件系统。
2026-04-05 16:24:11
342
原创 03 VS项目编译报错warning C4005: “AF_IPX”: 宏重定义warning C4005: “AF_IPX”: 宏重定义
VS项目编译报错warning C4005: “AF_IPX”: 宏重定义warning C4005: “AF_IPX”: 宏重定义
2023-02-05 08:00:00
2013
原创 02 Qt连接信号槽报错QObject::connect: Cannot queue arguments of type ‘******‘
Qt连接信号槽报错QObject::connect: Cannot queue arguments of type ‘******‘
2023-02-04 08:00:00
877
原创 01 LNK2038:检测到“RuntimeLibrary”的不匹配项
qtmian.lib(qtmain_win.obj):error LNK2038:检测到“RuntimeLibrary”的不匹配项:值“MD_DynamicRelease”不匹配值“MT_StaticRelease”
2023-02-01 09:00:00
2735
原创 08 etcd环境安装
etcd环境安装etcd是一个分布式的键值存储系统,其优秀的读写性能、一致性和可用性的机制,非常适合用来做配置中心角色。1.下载[下载地址]下载预构建的二进制文件,根据不同平台选择:etcd-v3.5.2-darwin-amd64.zipetcd-v3.5.2-linux-amd64.tar.gzetcd-v3.5.2-linux-arm64.tar.gzetcd-v3.5.2-linux-ppc64le.tar.gzetcd-v3.5.2-linux-s390x.tar.gzetcd-v
2022-04-13 13:27:13
389
原创 07 Kibana环境安装
Kibana环境安装Kibana是一个开源分析和可视化平台,旨在与 Elasticsearch 一起使用。您可以使用 Kibana 搜索、查看存储在 Elasticsearch 索引中的数据并与之交互。您可以轻松地执行高级数据分析并在各种图表、表格和地图中可视化您的数据。注意:建议将 Kibana 与 Elasticsearch 安装在同一台服务器上,但这不是必需的。如果您将产品安装在不同的服务器上,则需要 kibana.yml在启动 Kibana 之前在 Kibana 配置文件中更改 Elastics
2022-04-12 10:41:59
2360
原创 06 ES(Elasticsearch)环境安装
ES(Elasticsearch)Elasticsearch是一个实时的分布式存储、搜索和分析引擎。它可以用于多种用途,但它擅长的一个方面是索引半结构化数据流,例如日志或解码的网络数据包。官方地址下载安装Elasticsearch下载地址deb for Debian/Ubuntucurl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.1.2-amd64.debsudo dpkg -i e
2022-04-12 10:40:03
1202
原创 04 JDK环境安装
下载JDK下载地址配置JAVA_HOMEC:\Program Files (x86)\Java\jdk1.8.0_91 CLASSPATH.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar; Path%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
2022-04-12 10:07:28
1271
原创 19 tail和sarama模块使用
tail模块下载go get github.com/hpcloud/tail使用package mainimport ( "fmt" "os" "time" "github.com/hpcloud/tail")/*type Config struct { // File-specifc Location *SeekInfo // 在seek的位置开始读 ReOpen bool // 重新打开重新创建的文件 (tail -F) MustExis
2022-03-30 23:00:44
414
原创 05 Kafka环境安装
1.下载地址kafka官方地址2.安装注意:kafka需要jdk支持,先安装jdk# ubuntu环境下安装jdk$ sudo apt install openjdk-11-jre-headlesskafka解压$ tar -xzf kafka_2.13-3.1.0.tgz$ cd kafka_2.13-3.1.03.启动kafka环境# 启动ZooKeeper服务# 将来,kafka将不在需要ZooKeeper$ bin/zookeeper-server-start.sh co
2022-03-28 21:49:00
2016
原创 18 数据库操作
GO操作MySQL1.下载驱动go get -u github.com/go-sql-driver/mysql2.数据库操作package mainimport ( "database/sql" "fmt" "os" _ "github.com/go-sql-driver/mysql")//表sys_configtype table struct { variable string value string set_time string set_by st
2022-03-25 20:37:11
873
原创 17 flag包介绍
1.os.Argsfunc main() { fmt.Printf("%T\n", os.Args) fmt.Printf("%#v\n", os.Args) fmt.Println(os.Args[1], os.Args[3])}输出结果:# .\zyz.test.com.exe a b c[]string[]string{"D:\\WorkSpace\\GoWorkspace\\src\\zyz.test.com\\zyz.test.com.exe", "a", "b", "c"}
2022-03-21 23:11:02
256
原创 16 软件测试
一、单元测试依赖 go test命令,在包目录内,所有以 test.go为后缀的源代码文件都是 go test测试的一部分类型格式作用测试函数函数名前缀为Test测试程序的一些逻辑行为是否正确基准函数函数名前缀为Benchmark测试函数的性能示例函数函数名前缀为Example为文档提供示例文档1.常规测试package calcimport ( "testing")func Test1Add(t *testing.T) { ret :
2022-03-21 23:09:57
142
原创 15 网络编程
TCP协议TCP服务端编程:package mainimport ( "fmt" "net" "os")func clientor(c net.Conn) { clientAddr := c.RemoteAddr().String() for { //1.接收客户端消息 buf := make([]byte, 128) _, err := c.Read(buf) if err != nil { fmt.Println("conneter read error.
2022-03-21 23:07:42
324
原创 14 互斥锁和原子操作
1.互斥锁package mainimport ( "fmt" "sync")var mutex sync.Mutexvar wg sync.WaitGroupvar x int = 0func add() { defer wg.Done() mutex.Lock() x++ mutex.Unlock()}func main() { for i := 0; i < 1000; i++ { wg.Add(1) go add() } wg.Wait(
2022-03-17 23:54:21
596
原创 13 线程(geroutine)和通道(channel)
一、线程(geroutine)1.线程使用package mainimport ( "fmt" "runtime" "time")func geroutine(i int) { fmt.Printf("[%d]geroutine is called.\n", i)}func main() { runtime.GOMAXPROCS(6) for i := 0; i < 10; i++ { go geroutine(i) } time.Sleep(time.Se
2022-03-17 23:50:53
390
原创 12 配置文件ini操作
1.安装$ go get gopkg.in/ini.v12.ini内容读取package mainimport ( "fmt" "log" "os" "gopkg.in/ini.v1")/* config.inimode=1[mysql]address=192.168.1.123port=3333user=rootpassword=root[oracle]address=000.000.000.000port=9999user=rootpassword=
2022-03-14 00:14:51
4034
原创 11 文件操作
一、文件读取操作1.用os读取文件func main() { //打开文件 file, err := os.Open("./array.go") if err != nil { fmt.Println(err) } //函数退出之前关闭文件 defer file.Close() //读取array.go内容 buf := make([]byte, 512) len, err := file.Read(buf) if err != nil { fmt.Println(err
2022-03-10 23:42:29
145
原创 10 接口(interface)
一、接口Interface接口是一种特殊的类型,抽象类型。1.定义/*type 接口名 interface{ 方法名1(参数1, 参数2...)(返回值1, 返回值2...) 方法名2(参数1, 参数2...)(返回值1, 返回值2...) ...}*///定义runer接口type runer interface { run()}//定义eater接口type eater interface { eat(string)}2.实现//定义dog类型type do
2022-03-10 16:33:06
287
原创 09 自定义类型和结构体
一、类型typetype myint1 int //自定义类型type myint2 = int //类型别名func main() { var m myint1 m = 100 fmt.Printf("%T\n", m) //main.myint1 var n myint2 n = 200 fmt.Printf("%T\n", n) //int}二、结构体1.定义//方法1:常规定义type person struct { name string age int
2022-03-08 00:09:14
133
原创 08 函数和defer
一、函数1.函数的定义//方式1:有参数有返回值func f1(a int, b int) (ret int) { return a + b}//方式2:有参数无返回值func f2(a int, b int) { fmt.Println("...")}//方式3:无参数有返回值func f3() (ret int) { return 1}//方式4:无参数无返回值func f4() { fmt.Println("...")}//方式5:多个返回值func f5
2022-03-08 00:06:13
114
原创 07 指针和map
一、指针&:取地址*:根据地址取值1.new//申请一个内存地址var p *intvar p1 = new(int)fmt.Println(p) //<nil>fmt.Println(p1) //0xc0001280582.make//区别于new,只用于slice、map、channel内存创建,返回类型而不是指针var a = make([]int, 3, 5)var b = make(map[string]int, 10)二、map1.定义
2022-03-05 14:49:26
170
原创 06 数组和切片
一、数组1.定义//数组的长度是类型的一部分//如果不初始化,默认值为零值(布尔值为false)var a1 [4]boolvar a2 [3]int2.初始化//初始化1var a1 [4]boolvar a2 [3]inta1 = [4]bool{true, true, true, true}a2 = [3]int{12, 23, 34}//初始化2a3 := [4]bool{true, true, true, true}a4 := [3]int{12, 23, 34}
2022-03-05 14:47:41
186
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅