- 博客(488)
- 收藏
- 关注
原创 实战设计模式之模板方法模式
咖啡制作是现实生活中运用模板方法模式的一个典型例子:虽然不同种类的咖啡(比如:浓缩咖啡、拿铁、卡布奇诺等)有不同的制作细节,但它们共享一个通用的流程框架。这个框架包括一些基本步骤,比如:加热水、冲泡咖啡、倒入杯中、添加调料。通过使用模板方法模式,我们可以定义这个通用的流程,并允许具体的咖啡类型自定义某些步骤。
2025-06-06 20:47:25
1431
23
原创 Linux系统编程之共享内存
在Linux系统中,共享内存也是一种高效的进程间通信机制,允许两个或多个进程共享同一块物理内存区域。通过这种方式,不同进程可以直接访问和操作相同的数据,从而避免了数据的复制。由于数据直接在内存中共享,没有额外的数据传输过程,因此速度非常快。虽然共享内存本身提供了快速的数据交换方式,但它并不提供同步机制。这意味着,需要我们自己实现同步措施以防止竞态条件。
2025-05-31 09:34:59
1047
19
原创 实战设计模式之访问者模式
访问者模式允许我们在不改变类的前提下,向已有类添加新的功能。简单来说,就是将算法与对象的数据结构进行分离的一种方法。在实际应用中,当我们需要对一组对象执行一些操作,而这些操作又需要随着需求的变化而不断变化时,访问者模式就显得尤为重要了。
2025-05-25 08:29:02
1722
26
原创 实战设计模式之状态模式
交通信号灯是现实生活中运用状态模式的一个典型例子:红绿黄三种颜色代表了三种不同的状态,每个状态都有特定的行为和持续时间。比如:红色灯表示停止,绿色灯表示通行,黄色灯则提醒驾驶员准备停车。状态模式可以帮助管理系统中信号灯的状态转换逻辑,确保每次只有一种状态是激活的,并且根据预定的时间间隔自动切换到下一个状态。
2025-05-18 10:08:48
2431
28
原创 Linux系统编程之消息队列
消息队列是一种进程间通信机制,通过发送和接收消息实现数据交换。它基于队列数据结构,支持多种消息类型和优先级,具有灵活性、可靠性和异步通信的优势。在Linux系统中,消息队列通过POSIX和SystemV接口实现。POSIX消息队列提供简单接口,支持优先级排队和异步通知,适合实时系统。SystemV消息队列虽然设计较早,但提供更细致的控制,支持消息过滤。两种消息队列均通过特定函数实现消息的发送、接收和管理。
2025-05-11 08:29:52
954
22
原创 实战设计模式之中介者模式
中介者模式是一种强大且灵活的设计模式,适用于需要优化对象间通信的场景。中介者模式通过引入一个中介对象,来封装一系列对象之间的交互。在没有中介者的情况下,这些对象之间可能会直接相互引用,导致系统中的类紧密耦合,难以维护和扩展。而通过使用中介者模式,可以将对象间的通信集中到一个中介者对象中,从而减少了对象之间的直接依赖,提高了系统的灵活性和可维护性。空中交通管制是现实生活中运用中介者模式的一个典型例子。在航空业中,空中交通管制系统扮演着中介者的角色。
2025-05-05 19:42:44
1791
25
原创 Linux系统编程之内存映射
内存映射是操作系统提供的一种机制,使得文件或设备的内容可以直接映射到进程的虚拟地址空间中。这意味着,我们可以像访问数组一样读写文件内容,而不需要显式地调用I/O函数进行数据传输。内存映射适用于多种应用场景,包括但不限于:大文件处理、数据库和缓存、进程间通信、内存映射文件等。内存映射的优势主要体现在如下三个方面。1、提高性能:减少了从磁盘到用户空间的数据复制过程。2、简化编程模型:可以通过指针直接访问文件内容,就像操作普通内存一样。3、支持共享内存。
2025-04-26 18:33:37
1347
23
原创 实战设计模式之备忘录模式
与解释器模式、迭代器模式一样,备忘录模式也是一种行为设计模式。备忘录模式允许我们保存一个对象的状态,并在稍后恢复到这个状态。该模式非常适合于需要回滚、撤销或历史记录等功能的应用场景。通过使用备忘录模式,开发者可以轻松添加诸如撤销/重做、快照等高级功能,提升用户体验。文本编辑器的撤销/重做功能是运用备忘录模式最典型的应用场景。当我们在文本编辑器中输入或修改内容时,编辑器会定期创建当前文档状态的“快照”,即备忘录。如果我们需要撤销最近的操作,编辑器可以从这些快照中恢复到之前的状态。
2025-04-19 19:17:38
1747
33
原创 Linux系统编程之虚拟内存
计算机内存是临时存储数据的地方,它比硬盘快得多,但容量有限。现代操作系统通过虚拟内存技术,使得每个进程都感觉自己独占整个地址空间,这不仅提高了安全性,也简化了内存管理。物理内存:实际安装在计算机上的RAM,它是计算机直接使用的高速存储器,所有正在运行的进程和操作系统内核共享同一块物理内存。相比硬盘等其他存储设备,物理内存提供了极高的读写速度。但受制于硬件限制,物理内存的大小通常是固定的,比如:4GB、8GB或更大。虚拟内存。
2025-04-13 09:11:40
1100
34
原创 实战设计模式之迭代器模式
与上一篇介绍的解释器模式一样,迭代器模式也是一种行为设计模式。它提供了一种方法来顺序访问一个聚合对象中的各个元素,而无需暴露该对象的内部表示。简而言之,迭代器模式允许我们遍历集合数据结构中的元素,而不必了解这些集合的底层实现细节。音乐播放器是运用迭代器模式的一个典型例子:当我们使用音乐播放器听歌时,通常会有“下一首”、“上一首”的功能来切换歌曲。这里的歌曲播放列表就相当于一个聚合对象,而用于切换歌曲的功能就是迭代器。用户可以轻松地遍历整个播放列表,而无需了解歌曲是如何存储或排序的。
2025-04-06 11:08:06
1879
39
原创 Linux系统编程之守护进程
在Linux系统中,守护进程是一个在后台运行的特殊类型的进程。它独立于控制终端,并且周期性地执行某种任务,或等待处理某些发生的事件。守护进程通常用于提供服务,比如:Web服务器、数据库管理系统等。守护进程具有以下四个核心特征。1、脱离终端。守护进程不与任何终端关联,这意味着它们不会因为用户注销而停止运行。2、生命周期长。随系统启动,直至系统关闭或终止。3、工作目录设为根目录。为了避免影响文件系统的卸载操作,守护进程的工作目录通常设置为根目录/。4、重定向标准输入输出。
2025-03-24 08:31:26
1579
28
原创 实战设计模式之解释器模式
作为一种行为设计模式,解释器模式提供了一种方法来定义语言的文法规则,并通过这些规则解析和处理特定类型的语言句子。简单来说,解释器模式允许我们定义一个代表某种语言中语法规则的对象结构,从而能够根据这些规则理解并处理语言中的表达式。表达式计算器是运用解释器模式的一个典型例子:想象一下,我们正在开发一个简单的数学表达式计算器,用户可以输入类似3 + (2 - 1)的表达式,并期望得到计算结果。在这种情况下,我们可以使用解释器模式来定义表达式的结构,并实现对这些表达式的解析和计算。
2025-03-18 08:56:00
1527
36
原创 Linux系统编程之有名管道
有名管道,也称为FIFO(First In First Out),是一种特殊的文件类型,允许在不相关的进程之间进行通信。与无名管道不同,有名管道具有一个路径名,并且可以在文件系统中找到。这使得它可以被任意两个或多个进程使用,而不仅仅限于父子进程。有名管道的名字通常位于临时目录下,或者根据应用程序的需求创建在其他位置。
2025-03-10 06:30:00
1916
30
原创 实战设计模式之享元模式
在开发过程中,我们经常会遇到创建大量具有相似属性的对象的情况。比如:在一个图形编辑器中,可能有成千上万的小图标或文字字符;在一个游戏中,可能有大量的敌人、子弹等重复元素。如果每个这样的对象都独立存储其所有信息,将会占用大量的内存空间,并可能导致性能问题。为了优化这种情况,我们可以考虑只创建一份包含共同属性的数据副本,然后让不同的对象引用这份数据。同时,各自维护自己的独特属性。这就是享元模式的核心思想:共享不可变的数据,以节省内存。
2025-03-03 06:30:00
1539
28
原创 实战设计模式之代理模式
与前面介绍的组合模式、外观模式相同,代理模式也是一种结构型设计模式。代理模式非常实用,特别是在需要增强现有对象的功能、控制访问权限或是优化性能的情况下。简单来说,代理模式提供了一个对象来控制对另一个对象的访问。这个“代理”,就像一个中介或代表,负责管理客户端与目标对象之间的交互。房地产中介是现实生活中运用代理模式的一个典型例子:当我们想要购买或租赁房产时,通常会通过一家中介公司来处理;这个中介就是卖方和买方之间的代理,它帮助双方沟通、协商价格、准备文件等。
2025-02-24 06:30:00
1577
32
原创 Linux系统编程之无名管道
在Linux系统中,无名管道是一种简单的进程间通信机制。它允许一个进程创建一对文件描述符,其中一个用于读取,另一个用于写入。当一个进程通过系统调用创建了一个无名管道后,便可以将这两个文件描述符传递给它的子进程,使得父子进程之间可以进行单向的数据交换。
2025-02-21 06:30:00
1026
22
原创 Linux系统编程之高级信号处理
在前一篇文章中,我们介绍了signal函数、sigaction函数等基本的信号处理方法。在本篇中,我们将介绍信号处理的一些高级用法,包括:阻塞与解除阻塞、定时器等。
2025-02-19 06:30:00
1083
12
原创 实战设计模式之外观模式
与前一篇介绍的组合模式相同,外观模式也是一种结构型设计模式。通过引入一个外观类,将多个系统的接口整合成一个高层次的接口,使得客户端可以更容易地使用这些系统。这个模式的主要目的是:降低系统的耦合度,简化客户端与子系统之间的交互。汽车驾驶是现实生活中运用外观模式的一个典型例子:当我们驾驶一辆汽车时,实际上是在与多个复杂的子系统进行互动(比如:发动机系统、刹车系统、转向系统、空调系统等);然而,驾驶员并不需要了解这些系统的内部工作原理,只需要操作方向盘、油门踏板、刹车踏板和一些简单的按钮即可。
2025-02-19 06:30:00
2404
29
原创 陶渊明,田园诗派之祖
陶渊明的作品以其独特的艺术魅力和深刻的思想内涵,在中国文学史上占有重要地位。他的田园诗开创了中国古典诗歌的一个新流派,即田园诗派,对后世产生了深远的影响。唐代大诗人王维、孟浩然等人,都是受到陶渊明启发而创作出大量优秀田园诗的代表人物。
2025-02-17 06:30:00
240
11
原创 实战设计模式之组合模式
组合模式是一种结构型设计模式,允许我们将对象组合成树形结构,以表示部分和整体的层次关系。通过这种方式,我们可以统一地处理单个对象和对象组合。换句话说,组合模式使得客户代码能够忽略对象的层次结构,以一致的方式对待个体和集合。文件系统是运用组合模式的一个典型例子:计算机上的文件夹(或目录)可以包含其他文件夹或文件,而文件夹本身又可以被包含在更大的文件夹中。这种层次化的结构,允许用户以一致的方式来处理单个文件和整个文件夹。组合模式支持开闭原则,即对扩展开放,对修改关闭。
2025-02-17 06:30:00
1742
16
原创 Linux系统编程之基本信号处理
在前一篇文章中我们已经提到过,信号本质上是一个整数编号,每个编号对应一种特定类型的事件。当某个条件满足时,操作系统会生成相应的信号,并将其传递给目标进程。接收到信号后,进程可以选择忽略它、执行默认动作、或调用自定义的处理函数来响应。
2025-02-12 06:30:00
987
10
原创 实战设计模式之原型模式
与工厂方法模式、抽象工厂模式一样,原型模式也是一种对象创建型模式。它提供了一种创建对象的新方式:通过复制一个已有实例,来创建新的实例。这种方式避免了构造函数的局限性,特别是当对象的创建成本很高或初始化过程比较复杂时。在某些情况下,克隆现有对象可能比直接实例化新对象更高效。复印机是现实生活中运用原型模式的一个典型例子:当我们有一份纸质文档,并希望快速获得多份副本时,可以使用复印机来复制原始文档。这种方式比重新打印每一份文档要快得多,也更加方便。
2025-02-12 06:30:00
1343
18
原创 Linux系统编程之信号基础知识
信号是Linux系统中用于进程间通信的一种机制,允许一个进程通知另一个进程发生了某些特定事件。信号可以来自硬件中断、用户输入,也可以来自其他进程或者内核本身。信号是一种异步通知机制,当某个事件发生时,操作系统会向目标进程发送一个信号。信号本质上是一个整数值,每个值代表一种不同的事件类型。
2025-02-10 06:30:00
1690
16
原创 实战设计模式之责任链模式
与上一篇介绍的命令模式一样,责任链模式也是一种行为设计模式,它允许我们将请求沿着处理者链进行传递。接收者和发送者都没有对方的引用,且责任链中的节点可以动态地添加或移除。这样,就避免了请求发送者与多个接收者的硬编码依赖,使系统更加灵活。在下面三种应用场景中,我们可以毫不犹豫地使用责任链模式。1、有多个对象可以处理一个请求,但事先并不确定哪个对象会真正处理该请求,我们可以根据运行时信息来决定。2、想要在不明确指定接收者的情况下,向多个对象中的一个提交请求,即发送者不需要知道是谁最终处理了请求。
2025-02-10 06:30:00
1357
21
原创 软件工程师,2024年技术沉淀与人生感悟
每到新的一年,对过去的一年进行总结和回顾,似乎成为了一项传统。2024年已经离我们而去,2025年已然到来。回首2024,既有点像应试考试,无从下手,甚至有点后怕,又有点像闲扯家常,似乎有很多心里话想侃一侃、聊一聊。
2025-02-08 20:48:58
880
25
原创 曹植,独占八斗天下才
曹植的一生跨越了两个重要的历史阶段 —— 东汉末年的混乱和三国时期的初期稳定。他不仅目睹了父亲曹操如何一步步建立起强大的势力,也经历了哥哥曹丕篡汉建魏的过程。曹植个人的政治生涯充满了波折,但他在文学上的成就,却让他成为了中国历史上一位不可忽视的伟大诗人。
2025-01-14 13:05:37
745
13
原创 实战设计模式之命令模式
命令模式是一种行为设计模式,用于将请求封装成对象,从而使我们可以用不同的请求对客户进行参数化。简单来说,命令模式就是把一个请求转换为一个包含所有关于这个请求信息的对象。这样,就可以像传递其他对象一样传递这个请求,并且可以在适当的时间和地点执行它。命令模式主要适用于以下几种应用场景。1、需要支持撤销、重做操作的应用程序,比如:文本编辑器、绘图程序等。2、操作可以被放入队列中,并按顺序或特定条件执行的任务调度系统。3、提供统一接口给用户执行一系列操作的地方,比如:菜单项、工具栏等UI组件。
2025-01-14 13:03:00
2399
21
原创 Linux系统编程之线程优先级
在Linux系统中,线程优先级是影响多线程应用程序性能和响应速度的关键因素之一。通过合理设置线程优先级,可以确保关键任务得到及时处理,同时避免低优先级任务过度占用系统资源。线程优先级是指操作系统根据一定的规则分配给每个线程的一个数值,用于决定该线程获得CPU时间的顺序和频率。一般来说,优先级越高,线程越有可能被调度执行。相反,优先级较低的线程则需要等待高优先级线程完成之后才能获得CPU时间。然而,这并不意味着低优先级线程永远不会被执行,而是它们的执行机会相对较少。
2025-01-13 08:54:32
1637
19
原创 实战设计模式之桥接模式
与上一篇介绍的适配器模式一样,桥接模式也是一种结构型设计模式。它旨在将抽象部分与其实现部分分离,使它们可以独立变化。通过桥接模式,我们可以让一个类的功能模块化,并且可以在不修改其他模块的情况下进行扩展或修改。这种设计思路有助于创建更加灵活、易于维护的代码库。为了更好地理解桥接模式,我们以现实生活中的蜡笔和毛笔为例。假如我们需要大、中、小三种规格的蜡笔和毛笔,每种规格的笔需要支持红、黄、蓝三种颜色。
2025-01-10 06:30:00
3083
25
原创 实战设计模式之适配器模式
在大型项目中,我们可能会遇到以下一些典型场景。1、需要使用一些现有的类,但其接口不符合要求。2、想要创建一个可以重复使用的类,该类可以与其他不相关的类或不可预见的类(即接口可能并不兼容的类)协同工作。3、需要使用第三方库或框架中的类,但是它们的接口与系统的其他部分不兼容。此时,如果直接修改这些类、库、组件或框架的源代码来适应新的要求,可能会破坏原有的功能或者违反开闭原则。为了解决这个问题,我们可以使用适配器模式。
2025-01-08 06:30:00
1659
17
原创 Linux系统编程之线程同步
在多线程编程中,线程同步是确保多个线程能够安全、高效协作的关键。当多个线程访问共享资源时,如果不加以控制,可能会导致不一致的状态或错误的行为。比如:两个线程同时尝试修改同一个变量,可能导致其中一个修改被覆盖,或者产生未定义的结果。为了避免这些问题,我们需要引入同步机制来协调线程之间的操作顺序,确保每次只有一个线程可以访问特定的资源。
2025-01-08 06:30:00
1525
11
原创 王勃,命运多舛的璀璨人生
尽管王勃的生命短暂,但他对中国文学的发展产生了重要影响。他是唐代诗歌变革初期的重要代表人物之一,为后来盛唐诗歌的繁荣奠定了基础。王勃与其他三位“初唐四杰”共同推动了五言律诗和骈文的发展,促进了唐代文学风格从六朝以来的纤细柔弱向雄浑豪放转变。因此,在中国文学史上,王勃被视为承前启后的关键人物,其贡献得到了广泛的认可与赞誉。
2025-01-06 06:30:00
1253
7
原创 Linux系统编程之多线程
线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运行单位。一个线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。相比于进程,线程是轻量级的实体,它们共享进程的资源(比如:内存地址空间等),因此创建和销毁线程的成本较低。因为线程共享相同的地址空间,所以它们之间的通信非常高效,不需要像进程间通信那样通过复杂的机制。
2025-01-06 06:30:00
2763
23
原创 实战设计模式之建造者模式
在实际项目中,我们有时会遇到需要创建复杂对象的情况。这些对象可能包含多个组件或属性,而且每个组件都有自己的配置选项。如果直接使用构造函数或前面介绍的工厂方法来创建这样的对象,可能会导致以下两个严重问题。1、参数过多。当一个类有很多可选参数时,构造函数可能会变得非常庞大,难以维护。此外,调用方必须记住哪些参数是必需的,哪些是可选的,这在一定程度上增加了出错的风险。2、代码冗余。如果每次创建对象都需要传递大量的参数,那么代码将会变得冗长、复杂且难以理解。
2025-01-03 06:30:00
2373
34
原创 Linux系统编程之设备文件与ioctl
在Linux系统中,所有的硬件设备都被抽象为文件,这些文件被称为设备文件。通过使用标准的文件操作函数(比如:open、close、read、write),可以对硬件设备进行控制和数据传输。但对于某些复杂或特定的硬件功能,标准的文件操作可能无法满足需求。这时候,就需要使用ioctl函数来实现更精细的控制。
2025-01-02 06:30:00
1437
27
原创 实战设计模式之装饰器模式
在软件开发中,我们经常遇到需要给现有对象添加新功能的情况。最直接的方法是通过继承来实现,即创建一个子类,并重写或新增方法。然而,继承这种方式有如下几个缺点。1、违反开放封闭原则。开放封闭原则指出软件实体应该是对扩展开放的,但是对修改关闭的。使用继承来添加功能会使得我们必须修改已有的类,这显然不符合这一原则。2、代码膨胀。如果一个类有多种可选的行为,那么为了覆盖所有可能的组合,可能会导致大量的子类产生,使代码库变得臃肿、难以维护。3、灵活性不足。
2024-12-31 06:30:00
2438
32
原创 Linux系统编程之文件系统的挂载
在Linux系统中,所有的存储设备(比如:U盘、硬盘等)都不是直接可用的。为了使这些设备上的数据能够被操作系统读取和写入,我们必须将它们“挂载”到文件系统的某个位置。这就好比是在树上添加一个新的分支,挂载点就是这个新分支的位置,而所挂载的文件系统则成为了该位置下的子树。挂载的好处在于:它可以让我们将多个不同的物理设备整合成一个统一的文件层次结构,简化了对多个存储设备的管理和使用。此外,它还允许我们对不同类型的文件系统进行灵活的配置和访问控制。
2024-12-30 06:30:00
2385
26
原创 曹雪芹,梦断红楼留不朽
红楼梦》不仅是文学作品,也是文化的载体。书中涉及诗词歌赋、园林建筑、服饰饮食等多个方面,反映了当时社会的文化风貌。曹雪芹通过对传统文化的深入挖掘和创新性表达,使得《红楼梦》成为了研究清代文化不可或缺的重要文献。
2024-12-30 06:30:00
1134
9
原创 Linux系统编程之目录遍历
目录遍历是指以递归或循环方式,逐个访问文件系统中的文件和子目录,这通常用于实现文件搜索、备份工具、同步服务等功能。为了有效地遍历目录,Linux提供了多种方法,最常见的是:readdir和scandir。下面,我们将分别进行介绍。可以看到,readdir和scandir都可以用于读取目录内容。但它们的工作方式和使用场景有所不同,主要可以归纳为以下几点。1、使用场景。readdir:逐个读取目录条目,适用于简单的遍历操作。
2024-12-27 06:30:00
1090
16
原创 实战设计模式之策略模式
与前一篇文章中提到的观察者模式一样,策略模式也是一种行为设计模式。它允许我们定义一系列算法,并将每个算法封装起来,使它们可以互换使用。通过这种方式,策略模式使得算法的变化独立于使用这些算法的客户端,从而提高了系统的灵活性和可维护性。商场的折扣计算是运用策略模式的一个典型例子:在促销活动中,顾客可以享受不同的折扣,包括满减优惠、会员专享折扣、节日特惠等;当顾客结账时,系统可以根据实际情况选择适用的折扣策略进行计算。这种设计使得折扣规则易于管理和扩展,同时也提高了系统的灵活性。
2024-12-27 06:30:00
1893
28
软件开发+设计模式+架构设计
2025-03-02
《超级面试官读书笔记》职场+面试+笔记
2024-09-25
IPC库 + 跨平台 + Ingenic芯片方案
2024-06-02
超级好用的C++实用库 + 跨平台 + 通用
2024-05-23
微信小程序+百货商城源码
2024-04-27
微信小程序+淘宝客完整源码+PHP后台
2024-04-27
微信小程序+云商城+PHP后端
2024-04-27
pyhon小游戏+碰撞检测+贪吃蛇+练手
2024-03-16
Linux常用命令大全(从入门到精通)
2024-03-05
音视频领域相关的基础知识
2024-02-29
C&C++编程规范(超级实用)
2024-02-13
软件开发培训之如何编写优雅的代码
2024-02-13
软件开发培训之如何全面思考问题
2024-02-13
软件开发培训之深度学习基本概念和原理
2024-02-13
软件开发培训之JavaScript ES6介绍
2024-02-13
软件开发培训之如何理解设计模式
2024-02-13
软件开发培训之深度学习简介
2024-02-13
软件开发培训之TypeScript简介
2024-02-13
软件开发培训之64位程序开发注意事项
2024-02-13
软件开发培训之指针使用注意事项
2024-02-13
软件开发培训之结构体使用注意事项
2024-02-13
一分钟考考你 —— 测试题2
2023-02-22
一分钟考考你 —— 测试题1
2023-02-20
TA创建的收藏夹 TA关注的收藏夹
TA关注的人