- 博客(17)
- 收藏
- 关注
原创 Go 多进程编程-socket(套接字)
这里用 Go 完成一个服务端程序和客户端程序, 两者通过 socket 进行通信. 这是一个简单示例, 在通信流程中, 客户端程序和服务端程序建立连接后酯交换一次数据, 而在实际的应用场景中则会进行多次.注意: 下图中虚线框之内的子流程一般会循环很多次使用函数Listen()接受两个string类型作为参数字面量socket 协议备注“tcp”TCP无“tcp4”TCP网络互联层协议仅支持IPv4“tcp6”TCP网络互联层协议仅支持IPv6“udp”UDP无“udp4”
2025-08-11 16:45:53
590
原创 Go 多进程编程–进程
进程是UNIX及其衍生操作系统的根本所在, 原因在于所有代码都是在进程中执行.通常将一个程序的执行成为一个进程, 反过来讲, 进程用于描述程序的执行过程.因此程序和进程是一对概念, 分别描述一个程序的静态形式和动态特征.进程同时还是操作系统进行资源分配的一个基本单位。
2025-08-11 16:35:47
400
原创 C++ 设计模式 十九:观察者模式 (读书 现代c++设计模式)
何时需要使用观察者模式?观察者模式的核心应用场景是实现对象间的一对多依赖关系,当被观察对象(Subject)的状态变化需要自动通知多个依赖对象(Observer)时使用。事件驱动系统GUI框架中按钮点击事件、数据模型变化触发视图更新。示例:用户点击按钮后,通知多个UI组件刷新状态。实时数据分发传感器数据更新时,通知多个监控模块(如温度传感器→显示屏、报警器)。发布-订阅机制消息队列中生产者发布消息,多个消费者订阅并处理消息。示例:新闻推送系统,用户订阅主题后接收相关新闻。
2025-02-27 18:43:54
1885
原创 C++ 设计模式 十二:责任链模式 (读书 现代c++设计模式)
责任链模式的核心思想责任链模式允许将多个处理对象(Handler)链接成链,请求沿链传递,直到被某个处理对象处理。其核心是解耦请求发送者和接收者,支持动态调整处理逻辑。何时需要使用责任链模式?责任链模式的核心应用场景是动态组织多个对象处理同一请求多级处理逻辑请求需要经过多个处理者按顺序处理,且处理者的顺序或组合可能动态变化。示例:审批流程(员工→经理→CEO)、HTTP中间件链、异常处理链。解耦请求与处理者客户端无需知道具体由哪个对象处理请求,只需将请求提交到链的起点。
2025-02-26 19:01:33
2057
原创 C++ 设计模式 十一:代理模式 (读书 现代c++设计模式)
何时需要使用代理模式?代理模式的核心应用场景是控制和管理对对象的访问延迟加载(虚拟代理)当对象创建开销大时(如大文件加载、数据库查询),代理可延迟实际对象的初始化,仅在需要时创建。示例:网页图片的占位符代理,仅在用户滚动到可见区域时加载真实图片。访问控制(保护代理)限制客户端对敏感对象的直接访问,代理可添加权限验证逻辑。示例:文件系统代理检查用户权限后再允许文件操作。远程服务调用(远程代理)代理隐藏远程调用的复杂性(如网络通信、序列化),使客户端像调用本地对象一样操作远程服务。
2025-02-25 19:09:15
922
原创 C++ 设计模式 十:享元模式 (读书 现代c++设计模式)
何时需要使用享元模式?享元模式的核心应用场景是优化大量相似对象的内存占用和性能开销系统中存在大量重复对象:例如游戏中的粒子效果、文本编辑器中的字符、图形应用中的图标等,这些对象具有高度相似性。对象状态可分离为内部与外部内部状态:对象固有的、可共享的部分(如字符的字体、颜色)。外部状态:依赖上下文且不可共享的部分(如字符在屏幕上的位置)。需要缓存或复用对象:如数据库连接池、线程池等资源复用场景。享元模式解决的核心问题内存消耗过大:通过共享内部状态,减少重复对象的存储空间。对象创建与销毁开销高。
2025-02-24 23:11:16
1205
原创 C++ 设计模式 九:外观模式 (读书 现代c++设计模式)
何时需要使用外观模式?外观模式的核心应用场景是简化复杂系统的接口降低系统复杂度:当一个子系统由大量相互依赖的类或模块组成时,提供一个统一的高层接口,减少客户端与子系统的直接交互。解耦客户端与子系统:避免客户端代码直接依赖子系统的内部实现细节,提高子系统的独立性和可维护性。分层设计:在多层架构中,为某一层提供简化的访问入口(如服务层封装数据访问层和业务逻辑层)。外观模式解决的核心问题接口过度耦合客户端需要直接调用多个子系统的接口,导致代码冗余且难以维护。子系统内部变化可能迫使客户端频繁修改代码。
2025-02-23 20:59:03
897
原创 C++ 设计模式 八:装饰器模式 (读书 现代c++设计模式)
何时需要使用装饰器模式?装饰器模式的核心应用场景是动态地为对象添加功能,同时避免因继承导致类层次结构复杂化。运行时扩展对象功能:在不修改原有代码的情况下,动态地为一个对象叠加多个功能(如颜色、透明度、日志记录等)。避免类爆炸:当需要为对象提供多种功能的排列组合时,继承会导致大量子类(如),而装饰器模式通过组合灵活解决这一问题。遵循开闭原则:对扩展开放(允许新增装饰器),对修改关闭(不修改原有类)。装饰器模式解决的核心问题继承的局限性继承是静态的,功能扩展需要在编译时确定。
2025-02-22 20:06:50
1114
原创 C++ 设计模式 七:组合模式 (读书 现代c++设计模式)
复合设计模式允许我们为单个对象和对象集合提供相同的接口。这可以通过显式使用接口成员来完成,也可以通过(在程序设计中是动态类型的一种风格。在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由”当前方法和属性的集合”决定)来完成。例如基于范围的for循环并不需要您继承任何东西,而是通过实现begin()和end()。正是这些成员允许标量类型伪装成“集合”。同样有趣的是,我们的函数的嵌套forNeuron返回Neuron*而返回——这两者并不完全相同。哈哈,这就是模板的魅力。
2025-02-18 20:09:55
488
原创 C++ 设计模式 六:桥接模式 (读书 现代c++设计模式)
桥是一个相当简单的概念,作为一个连接器或胶水,连接两个部分在一起。抽象(接口)的使用允许组件在不真正了解具体实现的情况下相互交互。桥接模式的参与者确实需要知道彼此的存在。具体来说,一个Circle需要一个对Renderer引用,相反,渲染器知道如何具体地绘制圆(成员函数的名称)。这可以与中介模式形成对比,中介模式允许对象在不直接感知对方的情况下进行通信。
2025-02-17 13:07:32
1094
原创 C++ 设计模式 五:适配器模式 (读书 现代c++设计模式)
适配器是一个非常简单的概念: 它允许你调整所拥有的接口以适应所需要的接口。// 绘图函数调用也做出修改, 直接在缓存过的点集合中取值.作者在这之后又讲了一种用hash函数作为缓存的操作, 用到了boost库, 我的知识储备让我看不懂, 不做介绍了.### 总结适配器是一个非常简单的概念: 它允许你调整所拥有的接口以适应所需要的接口。适配器的唯一实际问题是,在适应过程中,有时需要生成临时数据,以满足数据的其他表示形式。当这种情况发生时,请使用缓存:确保只在必要时才生成新数据。
2025-02-16 16:02:37
550
原创 C++ 设计模式 四:单例模式 (读书 现代c++设计模式)
单例也不一定是总会带来巨大消极影响的,但如果使用不慎,单例会破坏应用程序的可测试性和可重构性。如果确实必须使用单例,要尝试避免直接使用, 例如,编写这样一长串的链式调用耦合性过高, 一旦要修改代码则代价过大.可以用上控制反转(IoC), 将对象的创建和管理交给外部容器或框架来实现解耦, 在控制反转的一些方法中可以用依赖注入(DI), 将依赖项作为参数传递给类或函数,而不是在类内部创建这些依赖项.
2025-02-15 12:33:42
804
原创 C++ 设计模式 三:原型模式 (读书 现代c++设计模式)
原型设计模式阐释了对象深度拷贝的概念,并不需要每次都通过构造函数完整初始化来创建一个对象,可以对创建好的对象进行复制,复制产生的对象和原来的对象互不依赖,稍加修改后就能得到想要的新对象。在代码中正确的复制对象,即进行深拷贝。可以在拷贝构造函数/拷贝赋值运算符或单独的成员函数中实现。在代码中支持序列化/反序列化,序列化后再进行反序列化实现拷贝。该方法需要额外的计算开销,拷贝频率越高,开销越大。该方法相对于拷贝构造函数的唯一优点是能复用已有的序列化代码。原型设计模式阐释了对象深度。
2025-02-14 16:21:55
2216
原创 C++ 设计模式 二:工厂模式与抽象工厂模式 (读书 现代c++设计模式)
回顾下这章涉及到的术语:工厂方法(factory method)是类的成员函数,可以作为创建对象的一种方式,通常用来替代构造函数。工厂(factory)通常是知道如何创建对象的独立的类,尽管如果你传递构造对象的函数(std::function,函数指针或者函数对象)到某个函数里面,这个参数通常也被称为工厂。抽象工厂(abstract factory),顾名思义,是一个抽象类,可以被生产一系列对象的具体类所继承。抽象工厂在实际中很少见。
2025-02-13 18:37:53
659
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人