251018 thinking composite
1. 什么是组合模式组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构以表示“部分-整体”的层次关系。组合模式使得客户端可以统一地处理个别对象和对象组合。 2. 为什么需要组合模式组合最主要的功能是在整个树状结构上递归调用方法并对结果进行汇总。 3. 组合模式的实现(go)假定一个文件系统,其中包含文件和目录。目录可以包含其他文件和目录。 现在我们需要搜索文件系统中是否包含某个文件。 12345678910111213141516171819202122232425262728293031323334type Component interface { Search(keyword string)}type Directory struct { Name string children []Component}func (d *Directory) Search(keyword string) { if d.Name == keyword...
251019 record Duetting
与Gemini-2.5-pro一次对话的记录。 1. round11.1. user你是一个深刻的哲学家,你需要用尽一切论据、细节和逻辑,来寻找我的思想的错误与漏洞、或是不清楚的地方,与我交流、讨论、辩论,质问我,目的不是证明我是错的,而是启发我,能让我思考,让我能得到自己的答案。我有一个疑问:我觉得人生的首要目标还是要过好这一生,健康,自我满足,快乐,几乎不会悔恨。这个目标很空,很大。因此可以具体地化为一些事情,比如:“环球旅行一次”、“发布引人注目的研究成果”等。但是,达到任何目标都会是要付出代价。比如,我想“环球旅行”,就必须得赚钱,就必须得辛苦地做枯燥的工作,作息紊乱;我想在科研上做出成绩,就必须得先取得博士学位,现在作为一个本科生,就得卷绩点卷科研,每天为排名而发愁;我想……说实话,这个“代价”与过程肯定是完全违反了“过好这一生”这个想法。但我该怎么办?我难道能不去做吗?但这样且不说最终能不能得到我想要的东西,而这个代价是否高昂得有些讽刺了:为了环球旅行享受人生,先得抛弃自己生活地工作个几十年,等有资本享受人生了,却也早没有享受人生的精力与时间了? 1.2....
251018 thinking bridge
1. 什么是桥接模式?桥接模式(Bridge Pattern)是一种结构型设计模式,它的核心思想是将抽象部分与它的实现部分分离,使它们都可以独立地变化。 想象一下电视机和遥控器的关系: 抽象层:遥控器。它定义了高层操作,如 开机()、关机()、换台()。不同的遥控器(如 普通遥控器、智能遥控器)可以有不同的交互方式,但它们都服务于控制电视这个目的。 实现层:电视机。它负责执行具体的操作,如 物理开机()、切换视频源()。不同的电视品牌(如 索尼电视、三星电视)有各自的实现细节。 桥接模式就像是在遥控器中内置一个对电视机实例的引用。遥控器的按钮按下后,会调用它所引用的那台电视机的具体方法。通过这种方式,你可以独立地更换遥控器(从普通遥控器升级到智能遥控器),而无需关心电视机的品牌;同样,你也可以独立地更换电视机(从索尼换成三星),而遥控器无需任何改变。它们通过一个“桥梁”连接,各自演化。 2....
251018 thinking adapter
1. 什么是适配器模式?适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将一个类的接口转换为客户端期望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的类可以协同工作。 就像 “USB-C 转 3.5mm 音频” 转换器。很多新款手机(被适配者 Adaptee)取消了传统的 3.5mm 耳机孔,只提供 USB-C 接口。如果你想使用旧的 3.5mm 插头耳机(客户端 Client),就会遇到接口不兼容的问题。 此时,这个转换器就充当了适配器(Adapter)的角色。它将手机的 USB-C 接口转换为耳机(客户端)所期望的 3.5mm 音频插孔。通过这个小小的转换器,耳机无需任何改动,就能在新手机上继续使用,适配器完美地弥合了两者之间的接口差异。 2....
251017-thinking-prototype
1. 什么是原型模式?一言以蔽之,原型模式(Prototype Pattern)是一种创建型设计模式,它允许客户端直接调用Clone方法来创建一个与已有实例完全一致的新的实例,而不需要知道已有实例的构造函数以及构造参数。 2. 为什么需要原型模式?正如上述,原型模式的主要优势在于它允许客户端直接调用Clone方法来创建一个与已有实例完全一致的新的实例,而不需要知道已有实例的构造函数以及构造参数。这使得原型模式在需要快速创建多个相同对象的场景下非常有用,例如在游戏开发中创建多个相同类型的敌人实例。 3. 原型模式的实现(go)原型模式提供prototype接口,主要需要实现Clone方法,该方法返回一个与已有实例完全一致的新的实例。 中间件代码示例: 12345678910111213type prototype interface { Clone() prototype}type concreteType struct { // ...构造参数}func (c *concreteType) Clone() prototype...
251012 thinking reflect
最近在用 Gin/GORM 尝试写一个后端。受 PostgREST 的启发,我想实现一个更通用的后端:它能运行时自动查询数据库的表结构,并动态生成对应的模型 (Model) 和控制器 (Controller),从而免去为每张表手动编写重复代码的麻烦。 Go 的反射 (Reflection) 机制是实现这一目标的关键。它允许程序在运行时检查自身的结构、类型和值。 本篇将介绍 Go 反射的核心思想,并演示如何利用它在运行时动态构建新的结构体类型。 1. 反射的核心:Type 与 ValueGo 的反射机制建立在两个核心概念之上:reflect.Type 和 reflect.Value。 可以把任意变量看作一个“箱子”,箱子里装着实际的数据。 **reflect.Type**:是箱子的“标签”,告诉你里面装的是什么类型的东西(比如 int, string, struct)。 **reflect.Value**:是箱子里的“东西本身”,你可以读取它的值,甚至在满足特定条件时修改它。 我们通过 reflect.TypeOf() 和 reflect.ValueOf()...
251012 record best-time-to-buy-and-sell-stock
题目 123456789int maxProfit(vector<int>& prices) { int lo = prices[0] int ans = 0 for(int i=1;i<prices.size();i++){ ans = max(ans,prices[i]-lo) lo = min(lo,prices[i]) } return ans} 这个模板可以用于:寻找不单增数组的元素与该元素前面的所有元素之差的最大值。
251006-251012 weekly Qt
最近在做一个简单的桌宠,以下记录我对C++ Qt的一些理解。 我认为,一个Qt应用主要围绕两大块:同步的UI初始化与异步的事件循环。 1. 同步的UI初始化Qt 窗口(或任何 QWidget)的生命周期始于其构造函数。在这里,我们以常规的、同步的方式完成所有UI布局和初始属性设置。这部分代码会一次性执行完毕,构建出窗口的静态初始外观。用时可以忽略不计。 需要延时触发/用户事件驱动的部分就需要Qt特别的事件处理机制————信号与槽来实现。 2. 异步的事件循环静态的UI只有在响应外部变化(如用户点击、网络数据到达、定时器触发)时才具有生命力。Qt 通过一个持续运行的事件循环 (Event Loop) 来管理这一切。 程序在完成同步初始化后,会交出控制权给事件循环。事件循环负责监听各种事件源,并将它们派发给相应的对象。而信号与槽 (Signals & Slots) 机制,正是 Qt 对这种异步模型优雅、类型安全的封装。 信号Signal:当某个对象的状态发生改变(如 QPushButton 被点击),它会 emit...
251012 thinking slider window
核心思想:使用两个指针l和r表示窗口的左右边界。r表示即将入窗口的元素,l表示即将出窗口的元素。这种出和入只发生在窗口特定的位置,与队列相似。 1. 定长滑动窗口只用r即可,l=r-w+1。 模板: 123456789101112for r in (0..n-1); do // enter (loop i) arr[r] enters the window l = r - w + 1 if l < 0; then continue fi // update (loop i) update window state // exit, prepare for the next loop (for loop i+1) l++done 注意:出窗口的操作要在更新窗口状态之后。这样,当r指代的元素入窗口时,由r推出的l所指代的元素会在下一轮循环开始之前出窗口。相应的,在下一轮循环i+1时,上一个r推出的l所指代的元素在i+1之前就出了窗口。确保状态更新时i+1的出入都发生过了。 2....
251012 thinking builder
1. 什么是生成器模式?生成器模式(Builder Pattern)是一种创建型设计模式,它将一个复杂对象的构建分成多个步骤,每个步骤可以被重写,因此使得同样的构建过程可以生成不同类型和形式的对象。 2. 为什么需要生成器模式?在一些情况下,我们需要根据不同的需求来创建不同类型的对象。如果使用简单的构造函数,会导致构造函数参数列表过长,或者参数顺序错误的问题。而生成器模式可以将对象的创建过程分解成多个步骤,每个步骤可以根据需求进行定制,从而避免了构造函数参数列表过长的问题。 3. 生成器模式的实现(go)生成器需要两个接口: Builder接口:是构建对象的接口,定义了构建对象需要哪些方法。 Director接口:定义了使用Builder接口来构建对象的过程。 中间件代码示例: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556type builder interface { SetPartA() ...