10 2022 档案
摘要:概述 根据单一职责原则,在软件中将一个系统划分为若干个子系统(Subsystem)有利于降低整个系统的复杂性,一个常见的设计目标是使客户类与子系统之间的通信和相互依赖关系达到最小,而达到该目标的途径之一就是引人一个外观(Facade)角色,它为子系统的访问提供了一个简单而单一的人口。外观模式也是迪米
阅读全文
摘要:概述 装饰模式可以在不改变一个对象本身功能的基础上给对象增加额外的新行为。在现实生活中,这种情况也到处存在,例如一张照片,可以不改变照片本身,给它增加一个相框,使得它具有防潮的功能,而且用户可以根据需要给它增加不同类型的相框,甚至可以在一个小相框的外面再套一个大相框。 装饰模式是一种用于替代继承的技
阅读全文
摘要:概述 对于树形结构,当容器对象(例如文件夹)的某一个方法被调用时,将遍历整个树形结构,寻找也包含这个方法的成员对象(可以是容器对象,也可以是叶子对象)并调用执行,牵一而动百,其中使用了递归调用的机制来对整个结构进行处理。由于容器对象和叶子对象在功能上的区别,在使用这些对象的代码中必须有区别地对待容器
阅读全文
摘要:概述 桥接模式是一种很实用的结构型设计模式。如果软件系统中某个类存在两个独立变化的维度,通过该模式可以将这两个维度分离出来,使两者可以独立扩展,让系统更加符合单一职责原则。与多层继承方案不同,它将两个独立变化的维度设计为两个独立的继承等级结构,并且在抽象层建立一个抽象关联,该关联关系类似一条连接两个
阅读全文
摘要:概述 与电源适配器相似,在适配器模式中引入了一个被称为适配器(Adapter)的包装类,而它所包装的对象称为适配者(Adaptee),即被适配的类。适配器的实现就是把客户类的请求转化为对适配者的相应接口的调用。也就是说:当客户类调用适配器的方法时,在适配器类的内部将调用适配者类的方法,而这个过程对客
阅读全文
摘要:概述 建造者模式又称为生成器模式,它是一种较为复杂、使用频率也相对较较低的创建型模式。建造者模式为客户端返回的不是一个简单的产品,而是一个由多个部件组成的复杂产品。 建造者模式是较为复杂的创建型模式,它将客户端与包含多个组成部分(或部件)的复杂对象的创建过程分离,客户端无须知道复杂对象的内部组成部分
阅读全文
摘要:概述 在使用原型模式时,需要首先创建一个原型对象,再通过复制这个原型对象来创建更多同类型的对象。其定义如下:使用原型实例指定创建对象的种类,并且通过克隆这些原型创建新的对象。原型模式是一种对象创建型模式。 原型模式的工作原理很简单:将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求
阅读全文
摘要:简介 工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题,但由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,势必会增加系统的开销。此时,可以考虑将一些相关的产品组成一个 "产品族",由同一个工厂来统一生产,这就是抽象工厂模式的基本思想。 比如,对
阅读全文
摘要:简介 在简单工厂模式中只提供一个工厂类,该工厂类处于对产品类进行实例化的中心位置,它需要知道每一个产品对象的创建细节,并决定何时实例化哪一个产品类。简单工厂模式最大的缺点是当有新产品要加入到系统中时,必须修改工厂类,需要在其中加入必要的业务逻辑,这违背了开闭原则。此外,在简单工厂模式中,所有的产品都
阅读全文
摘要:概述 简单工厂模式其实并不属于 GoF 23 个经典设计模式,但是它是其他工厂模式的基础,其基本流程如下: 首先将需要创建的各种不同对象的相关代码封装到不同的类中,这些类称为具体产品类,每一个具体产品类都是抽象产品类的子类;然后提供一个工厂类用于创建各种产品,在工厂类中提供一个创建产品的工厂方法,该
阅读全文
摘要:必要环境 输入如下命令以安装必要的环境: sudo apt-get update sudo apt-get install cmake build-essential g++ python-dev-is-python3 autotools-dev libicu-dev build-essential
阅读全文
摘要:简介 在实际开发中,为了节约系统资源,有时需要确保系统中某个类只有唯一一个实例,当这个唯一实例创建成功之后,无法再创建一个同类型的其他对象,所有的操作都只能基于这个唯一实例。为了确保对象的唯一性,可以通过单例模式来实现,这就是单例模式的动机所在。 单例模式的定义:确保某一个类只有一个实例,而且自行实
阅读全文
摘要:UML图示简介 在 UML 中,类使用包含类名、属性和操作且带有分割线的长方形来表示,如图所示,定义一个 Student 类,它包含属性 name、age 和 id,以及操作 modifyInfo()。 其对应的 C++ 代码片段如下: class Student { public: void mo
阅读全文
摘要:Buffer 类的设计是一种应用层的输入输出缓冲技术。对于 Non-blocking IO 来说,其核心思想是避免阻塞在 read() 或 write() 或其他的 IO 系统调用上,这样就可以最大限度地复用 thread of control,让一个线程能够服务于多个 socket 连接。IO 线
阅读全文
摘要:Endian Endian.h 是一个公共头文件,里面包含了一些网络字节序和主机字节序相互转换的问题。 其中所使用的方法如下: // XX 位主机转网络 uint64_t htobe64(uint64_t data); uint32_t htobe32(uint32_t data); uint16_
阅读全文
摘要:Thread 在 Thread.cc 中,有一个 ThreadNameInitializer 类,用于线程环境初始化操作: void afterFork() { muduo::CurrentThread::t_cachedTid = 0; muduo::CurrentThread::t_thread
阅读全文
摘要:在并发编程中,常常需要用到线程安全的队列。常见的线程安全队列的设计分为两种: 阻塞队列:常用于生产者和消费者的场景,其中,生产者存放元素,而消费者获取元素。常用的实现方法是在入队和出队时使用同一把锁,或者入队和出队使用不同的两把锁。 非阻塞队列:与阻塞队列不同,非阻塞队列在队列为空时获取元素会直接返
阅读全文
摘要:该框架中的日志为诊断日志,用于将代码运行时的重要信息进行保存,方便故障诊断和追踪。日志通常分为如下两种: 同步日志:当需要写出一条日志消息时,只有等到这条日志消息完全写出时才能执行后续的程序,其问题在于可能会阻塞在磁盘写操作上; 异步日志:当需要写日志消息时,只是将日志消息进行存储,当积累到一定量时
阅读全文
摘要:Atomic 在 Atomic.h 文件中定义了原子操作类类型 AtomicIntegerT<T>,它使用了 GCC 内置的原子操作来实现。 原子操作在多线程开发中经常用到,比如计数器、序列产生器等。这些情况下数据有并发的危险,但是用锁去保护又显得有些浪费,会造成一定的性能瓶颈,而原子操作则更为节省
阅读全文
摘要:WeakCallback 在 WeakCallback.h 文件中定义了模板类 WeakCallback,在其模板参数中,有一个可变模板参数 ARGS,用以指示回调函数的参数。 在类内部,定义有两个成员变量,分别是 object_ 和 function_。 成员变量 object_ 是一个弱指针类型
阅读全文
摘要:ProcessInfo 在 ProcessInfo.h 文件中,存在一个命名空间 ProcessInfo,其中声明了大部分进程需要使用到相关信息的函数,比如进程的 PID、UID、EUID,主机名,进程状态,程状态等等。 在 ProcessInfo.cc 的 detail 命名空间定义了如下几个函数
阅读全文
摘要:StringPiece 在 StringPiece.h 文件中,声明了两个类类型,一个是 StringArg,另一个是 StringPiece,前者用于在传递函数参数时同时兼容 C 风格的字符串(const char*)和 C++ 风格的字符串(std::string)。而后者则可用于构建同时兼任这
阅读全文
摘要:CurrentThread 在 CurrentThread 命名空间中实现了有关线程 id 的管理和优化。其主要用于获取当前线程的 id,并将线程 id 保存为 C 语言风格的字符串: extern __thread int t_cachedTid; // 线程id extern __thread
阅读全文

浙公网安备 33010602011771号