<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[dqsjqian的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/dqsjqian</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; dqsjqian]]></copyright><item><title><![CDATA[Aria，一个工业级 C++20 MVVM 框架]]></title><link>https://blog.youkuaiyun.com/dqsjqian/article/details/163588934</link><guid>https://blog.youkuaiyun.com/dqsjqian/article/details/163588934</guid><author>dqsjqian</author><pubDate>Sat, 08 Aug 2026 12:51:53 +0800</pubDate><description><![CDATA[75+ 测试用例、7 个框架级 fuzzer、ASan/UBSan/TSan 全套、nightly 基准门禁——每条非平凡行为都有编号契约(L-13 / E-22),测试失败直接定位到权威文档。如果你写过 C++,一定懂这个痛:想用 MVVM,要么被 Qt 100MB+ 的体积压垮,要么被锁死在单一平台上,要么被一堆宏糊弄到怀疑人生。如果你也被 C++ 跨平台的痛戳中了,点个 Star,让更多 C++ 开发者看到它。做 C++ 的你,值得拥有一套"一套代码,全端通行"的现代 MVVM 框架。]]></description><category></category></item><item><title><![CDATA[小软件基础骨架]]></title><link>https://blog.youkuaiyun.com/dqsjqian/article/details/107581049</link><guid>https://blog.youkuaiyun.com/dqsjqian/article/details/107581049</guid><author>dqsjqian</author><pubDate>Sat, 25 Jul 2020 16:48:07 +0800</pubDate><description><![CDATA[#include &lt;iostream&gt;
#include &lt;memory&gt;
using namespace std;

// 组件
struct ComBase {
	// 展开UI面板
    virtual void show() = 0;
};

///////////////////////////////////////////////////////////////////////////
struct ComA : public ComBase {
    virtu.]]></description><category></category></item><item><title><![CDATA[基于Boost::Asio的定时器模块]]></title><link>https://blog.youkuaiyun.com/dqsjqian/article/details/106719091</link><guid>https://blog.youkuaiyun.com/dqsjqian/article/details/106719091</guid><author>dqsjqian</author><pubDate>Fri, 12 Jun 2020 16:38:17 +0800</pubDate><description><![CDATA[timer.hpp


#include &lt;list&gt;
#include &lt;memory&gt;
#include &lt;mutex&gt;
#include &lt;boost/asio.hpp&gt;
#include &lt;boost/asio/deadline_timer.hpp&gt;

typedef boost::system::error_code boost_error_code;
using namespace boost::asio;
using namespac]]></description><category></category></item><item><title><![CDATA[C++流日志的简单实现]]></title><link>https://blog.youkuaiyun.com/dqsjqian/article/details/106566323</link><guid>https://blog.youkuaiyun.com/dqsjqian/article/details/106566323</guid><author>dqsjqian</author><pubDate>Fri, 05 Jun 2020 11:07:08 +0800</pubDate><description><![CDATA[头文件 logger.h ：



#ifndef LIM_LOGGER_INCLUDE
#define LIM_LOGGER_INCLUDE

#include &lt;iostream&gt;
#include &lt;sstream&gt;
#include &lt;memory&gt;

// 强枚举类型，阻止普通变量代入
enum class LOGGER_LEVEL {
    LOGGER_INFO,
    LOGGER_DEBUG,
    LOGGER_ERROR,
    LOGGER]]></description><category></category></item><item><title><![CDATA[C++设计模式——观察者模式]]></title><link>https://blog.youkuaiyun.com/dqsjqian/article/details/103948248</link><guid>https://blog.youkuaiyun.com/dqsjqian/article/details/103948248</guid><author>dqsjqian</author><pubDate>Fri, 17 Jan 2020 16:37:05 +0800</pubDate><description><![CDATA[观察者模式

在GOF的《设计模式:可复用面向对象软件的基础》一书中对观察者模式是这样说的：定义对象间的一种一对多的依赖关系，当一个对象的状态发生改变时，所有依赖于它的对象都得到通知并被自动更新。当一个对象发生了变化，关注它的对象就会得到通知；这种交互也称为发布-订阅(publish-subscribe)。目标是通知的发布者，它发出通知时并不需要知道谁是它的观察者。

再说说上面的数据和图之间的关...]]></description><category></category></item><item><title><![CDATA[C++设计模式——状态模式]]></title><link>https://blog.youkuaiyun.com/dqsjqian/article/details/103948269</link><guid>https://blog.youkuaiyun.com/dqsjqian/article/details/103948269</guid><author>dqsjqian</author><pubDate>Fri, 17 Jan 2020 16:36:59 +0800</pubDate><description><![CDATA[前言

在实际开发中，我们经常会遇到这种情况；一个对象有多种状态，在每一个状态下，都会有不同的行为。那么在代码中我们经常是这样实现的。


typedef enum tagState
{
     state,
     state1,
     state2
}State;
 
void Action(State actionState)
{
     if (actionState == st...]]></description><category></category></item><item><title><![CDATA[C++设计模式——访问者模式]]></title><link>https://blog.youkuaiyun.com/dqsjqian/article/details/103948288</link><guid>https://blog.youkuaiyun.com/dqsjqian/article/details/103948288</guid><author>dqsjqian</author><pubDate>Fri, 17 Jan 2020 16:36:50 +0800</pubDate><description><![CDATA[访问者模式

在GOF的《设计模式:可复用面向对象软件的基础》一书中对访问者模式是这样说的：表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。访问者模式把数据结构和作用于结构上的操作之间的耦合解脱开，使得操作集合可以相对自由地演化。该模式的目的是要把处理从数据结构分离出来。访问者模式让增加新的操作很容易，因为增加新的操作就意味着增加一个新的访...]]></description><category></category></item><item><title><![CDATA[C++设计模式——策略模式]]></title><link>https://blog.youkuaiyun.com/dqsjqian/article/details/103948276</link><guid>https://blog.youkuaiyun.com/dqsjqian/article/details/103948276</guid><author>dqsjqian</author><pubDate>Fri, 17 Jan 2020 16:36:47 +0800</pubDate><description><![CDATA[策略模式

在GOF的《设计模式:可复用面向对象软件的基础》一书中对策略模式是这样说的：定义一系列的算法，把它们一个个封装起来，并且使它们可相互替换。该模式使得算法可独立于使用它的客户而变化。

策略模式为了适应不同的需求，只把变化点封装了，这个变化点就是实现不同需求的算法，但是，用户需要知道各种算法的具体情况。就像上面的加班工资，不同的加班情况，有不同的算法。我们不能在程序中将计算工资的算法进行...]]></description><category></category></item><item><title><![CDATA[C++设计模式——模板方法模式]]></title><link>https://blog.youkuaiyun.com/dqsjqian/article/details/103948295</link><guid>https://blog.youkuaiyun.com/dqsjqian/article/details/103948295</guid><author>dqsjqian</author><pubDate>Fri, 17 Jan 2020 16:36:43 +0800</pubDate><description><![CDATA[模板方法模式

在GOF的《设计模式:可复用面向对象软件的基础》一书中对模板方法模式是这样说的：定义一个操作中的算法骨架，而将一些步骤延迟到子类中。TemplateMethod使得子类可以不改变一个算法的接口即可重定义改算法的某些特定步骤。

我结合我在实际开发项目中的一个例子来说说这个模板方法模式吧。我们曾经做过一款产品，这个产品类似于一个云端的文件管理客户端。对于这样的一个客户端，由于其云端的...]]></description><category></category></item><item><title><![CDATA[C++设计模式——备忘录模式]]></title><link>https://blog.youkuaiyun.com/dqsjqian/article/details/103948241</link><guid>https://blog.youkuaiyun.com/dqsjqian/article/details/103948241</guid><author>dqsjqian</author><pubDate>Thu, 16 Jan 2020 17:45:59 +0800</pubDate><description><![CDATA[备忘录模式

在GOF的《设计模式:可复用面向对象软件的基础》一书中对备忘录模式是这样说的：在不破坏封装性的前提下，捕获一个对象的内部状态，并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。

有时有必要记录一个对象的内部状态。为了允许用户取消不确定的操作或从错误中恢复过来，需要实现检查点和取消机制，而要实现这些机制，你必须事先将状态信息保存在某处，这样才能将对象恢复到它们先前...]]></description><category></category></item><item><title><![CDATA[C++设计模式——中介者模式]]></title><link>https://blog.youkuaiyun.com/dqsjqian/article/details/103948237</link><guid>https://blog.youkuaiyun.com/dqsjqian/article/details/103948237</guid><author>dqsjqian</author><pubDate>Thu, 16 Jan 2020 17:45:50 +0800</pubDate><description><![CDATA[前言

我们都知道，这个国际政治是一门很深的学问，不玩政治的人是搞不懂的。那么多的国家，国家之间的关系又及其复杂；就好比现在，美国和中国有经济利益关系，美国又和日本有盟友关系，朝鲜又和中国有说不清道不明的关系；这些复杂的关系，稍微处理不好，就可能引发局部战争，更有可能引发第三次世界大战。如果出现了国与国之间出现了利益纠纷，那么该怎么办呢？这个时候，联合国出现了。联合国就是一个处理国与国之间纠纷的中...]]></description><category></category></item><item><title><![CDATA[C++设计模式——迭代器模式]]></title><link>https://blog.youkuaiyun.com/dqsjqian/article/details/103948215</link><guid>https://blog.youkuaiyun.com/dqsjqian/article/details/103948215</guid><author>dqsjqian</author><pubDate>Thu, 16 Jan 2020 17:45:44 +0800</pubDate><description><![CDATA[前言

最近非常感伤，总是怀念大学的日子，做梦的时候也常常梦到。梦到大学在电脑前傻傻的敲着键盘，写着代码，对付着数据结构与算法的作业；建立一个链表，遍历链表，打印链表。现在把那个时候声明的链表的头文件拿出来看看:


typedef struct tagNode
{
     int value;
     tagNode *pPre;
     tagNode *pNext;
}Node;
 
...]]></description><category></category></item><item><title><![CDATA[C++设计模式——解释器模式]]></title><link>https://blog.youkuaiyun.com/dqsjqian/article/details/103948208</link><guid>https://blog.youkuaiyun.com/dqsjqian/article/details/103948208</guid><author>dqsjqian</author><pubDate>Thu, 16 Jan 2020 17:45:38 +0800</pubDate><description><![CDATA[解释器模式

在GOF的《设计模式:可复用面向对象软件的基础》一书中对解释器模式是这样说的：给定一个语言，定义它的文法的一种表示，并定义一个解释器，这个解释器使用该表示来解释语言中的句子。如果一种特定类型的问题发生的频率足够高，那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器，该解释器通过解释这些句子来解决该问题。

就如上面说的那个游戏，我输入up walk ...]]></description><category></category></item><item><title><![CDATA[C++设计模式——命令模式]]></title><link>https://blog.youkuaiyun.com/dqsjqian/article/details/103948197</link><guid>https://blog.youkuaiyun.com/dqsjqian/article/details/103948197</guid><author>dqsjqian</author><pubDate>Thu, 16 Jan 2020 17:45:27 +0800</pubDate><description><![CDATA[什么是命令模式？

在GOF的《设计模式:可复用面向对象软件的基础》一书中对命令模式是这样说的：将一个请求封装为一个对象，从而使你可用不同的请求对客户进行参数化；对请求排队或记录请求日志，以及支持可撤销的操作。在OOP中，一切都是对象，将请求封装成对象，符合OOP的设计思想，当将客户的单个请求封装成对象以后，我们就可以对这个请求存储更多的信息，使请求拥有更多的能力；命令模式同样能够把请求发送者和接...]]></description><category></category></item><item><title><![CDATA[C++设计模式——职责链模式]]></title><link>https://blog.youkuaiyun.com/dqsjqian/article/details/103948192</link><guid>https://blog.youkuaiyun.com/dqsjqian/article/details/103948192</guid><author>dqsjqian</author><pubDate>Thu, 16 Jan 2020 17:45:21 +0800</pubDate><description><![CDATA[什么是职责链模式？

在GOF的《设计模式:可复用面向对象软件的基础》一书中对职责链模式是这样说的：使多个对象都有机会处理请求，从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链，直到有一个对象处理它为止；如下图：



对于每个角色，他们都有他们的职责；当我提交了休假申请时，项目经理需要判断，看看自己能否处理，如果休假超过了2个小时，那么项目经理就不能处理了；项目经理将这个请求提交...]]></description><category></category></item><item><title><![CDATA[C++设计模式——代理模式]]></title><link>https://blog.youkuaiyun.com/dqsjqian/article/details/103948180</link><guid>https://blog.youkuaiyun.com/dqsjqian/article/details/103948180</guid><author>dqsjqian</author><pubDate>Thu, 16 Jan 2020 17:45:15 +0800</pubDate><description><![CDATA[什么是代理模式？

在GOF的《设计模式:可复用面向对象软件的基础》一书中对代理模式是这样说的：为其他对象提供一种代理以控制对这个对象的访问。结合上面的游戏代理的例子和下面的图，我们来进行分析一下。以前你是这样玩游戏：



现在有了游戏代理，你是这样玩游戏：



代理服务器干了什么？它代替你去和游戏服务器进行交互。它访问游戏服务器的速度比你使用校园网访问游戏服务器的速度快很多。所以，你的游戏延...]]></description><category></category></item><item><title><![CDATA[C++设计模式——外观模式]]></title><link>https://blog.youkuaiyun.com/dqsjqian/article/details/103948159</link><guid>https://blog.youkuaiyun.com/dqsjqian/article/details/103948159</guid><author>dqsjqian</author><pubDate>Thu, 16 Jan 2020 17:45:03 +0800</pubDate><description><![CDATA[前言

在实际开发时，面对一个大的系统，总是会将一个大的系统分成若干个子系统，等子系统完成之后，再分别调用对应的子系统来完成对应的整体功能，这样有利于降低系统的复杂性；最终进行实现某个具体的功能时，我们将对应的子系统进行组合就好了；但是，子系统那么多，关系那么复杂，组合形成一个完整的系统，是存在难度的。

我们在使用visual studio进行编译C++代码时，你只是在菜单中选择了Build，然...]]></description><category></category></item><item><title><![CDATA[C++设计模式——享元模式]]></title><link>https://blog.youkuaiyun.com/dqsjqian/article/details/103948170</link><guid>https://blog.youkuaiyun.com/dqsjqian/article/details/103948170</guid><author>dqsjqian</author><pubDate>Thu, 16 Jan 2020 17:45:01 +0800</pubDate><description><![CDATA[什么是享元模式？

在GOF的《设计模式:可复用面向对象软件的基础》一书中对享元模式是这样说的：运用共享技术有效地支持大量细粒度的对象。

就如上面说的棋子，如果每个棋子都new一个对象，就会存在大量细粒度的棋子对象，这对服务器的内存空间是一种考验，也是一种浪费。我们都知道，比如我在2013号房间和别人下五子棋，2014号房间也有人在下五子棋，并不会因为我在2013号房间，而别人在2014号房间，...]]></description><category></category></item><item><title><![CDATA[C++大数运算]]></title><link>https://blog.youkuaiyun.com/dqsjqian/article/details/103951260</link><guid>https://blog.youkuaiyun.com/dqsjqian/article/details/103951260</guid><author>dqsjqian</author><pubDate>Thu, 16 Jan 2020 17:44:41 +0800</pubDate><description><![CDATA[#include &lt;cstring&gt;
#include &lt;string&gt;
#include &lt;iostream&gt;
using namespace std;

constexpr auto MAXN = 9999;
constexpr auto MAXSIZE = 1000;
constexpr auto DLEN = 4;

class BigN
{
priv...]]></description><category></category></item><item><title><![CDATA[C++设计模式——装饰模式]]></title><link>https://blog.youkuaiyun.com/dqsjqian/article/details/103948149</link><guid>https://blog.youkuaiyun.com/dqsjqian/article/details/103948149</guid><author>dqsjqian</author><pubDate>Sun, 12 Jan 2020 18:26:55 +0800</pubDate><description><![CDATA[前言

在实际开发时，你有没有碰到过这种问题；开发一个类，封装了一个对象的核心操作，而这些操作就是客户使用该类时都会去调用的操作；而有一些非核心的操作，可能会使用，也可能不会使用；现在该怎么办呢？

将这些非核心的操作全部放到类中，这样，一个类就包含了很多核心的操作和一些看似有关，但是又无关的操作；这就会使核心类发生“爆炸”的现象，从而使核心类失去了一定的价值，也使使用核心类的客户在核心操作和非核...]]></description><category></category></item></channel></rss>