设计模式
zhuge19870104
这个作者很懒,什么都没留下…
展开
-
C++11静态策略模式
本例和动态的策略模式一样。也是高层依赖于统一的策略接口,底层可以有不同的实现。但是使用模板选择不同的策略实现。[就是编译期静态选择实现]程序代码结构如下,代码如下,test/CMakeLists.txtcmake_minimum_required(VERSION 2.6)if(APPLE) message(STATUS "This is Apple, do nothing.") set(CMAKE_MACOSX_RPATH 1) set(CMAKE_PREFIX_PAT原创 2022-05-14 16:56:48 · 238 阅读 · 0 评论 -
C++ 11动态策略模式
本例使用虚函数和多态实现策略模式。高层方法依赖于抽象的策略指针,底层方法有自己的实现。策略模式使用的是组合指针的方式来实现的。程序代码结构如下,策略模式代码如下。test/CMakeLists.txtcmake_minimum_required(VERSION 2.6)if(APPLE) message(STATUS "This is Apple, do nothing.") set(CMAKE_MACOSX_RPATH 1) set(CMAKE_PREFIX_PA原创 2022-05-14 16:49:58 · 341 阅读 · 0 评论 -
C++ 11手写状态机
本文有电话的几种模式,通过一个trigger进行转换。在各种模式之间切换状态。手写状态机。程序代码结构如下,test/CMakeLists.txtcmake_minimum_required(VERSION 2.6)if(APPLE) message(STATUS "This is Apple, do nothing.") set(CMAKE_MACOSX_RPATH 1) set(CMAKE_PREFIX_PATH /Users/aabjfzhu/software/v原创 2022-05-13 11:06:44 · 342 阅读 · 0 评论 -
C++ 11经典状态模式
这个模式我本身并不喜欢。因为他是双向侵入式的。拥有状态的对象持有状态的指针。状态本身又需要持有状态的对象的指针。例如LightSwith持有State的指针。然后State的方法又依赖LightSwitch指针。甚至在发生某个状态切换的时候,出现了delete this语句。因为当前状态被废弃了。test/CMakeLists.txtcmake_minimum_required(VERSION 2.6)if(APPLE) message(STATUS "This is Apple, d原创 2022-05-13 09:57:22 · 115 阅读 · 0 评论 -
C++ 11 支持redo和undo的简单momento模式
本例简单的实现momento模式,并在简单momento模式上外加了一个undo和redo操作。使用std::vector实现这种操作。程序结构如下,test/CMakeLists.txtcmake_minimum_required(VERSION 2.6)if(APPLE) message(STATUS "This is Apple, do nothing.") set(CMAKE_MACOSX_RPATH 1) set(CMAKE_PREFIX_PATH /Users原创 2022-05-12 11:15:47 · 267 阅读 · 0 评论 -
C++ 11 使用 boost signals2库实现中介者模式
本例使用boost::signals2库实现中介者模式。其中Game是各个player持有的中介者。Coach负责连接Game和各个player的事件。程序结构如下,test/CMakeLists.txtcmake_minimum_required(VERSION 2.6)if(APPLE) message(STATUS "This is Apple, do nothing.") set(CMAKE_MACOSX_RPATH 1) set(CMAKE_PREFIX_PA原创 2022-05-12 09:13:41 · 386 阅读 · 0 评论 -
C++11 使用中结者模式实现ChatRoom逻辑
本例使用中结者模式实现ChatRoom逻辑。就是一个ChatRoom持有多个Person类的实例,多个Person类公用一个ChatRoom的指针。使用ChatRoom指针实现聊天操作。其中ChatRoom指针就是此处的中结者。![中结者模式结构示意图](https://img-blog.csdnimg.cn/410e11491c49448190035c34780a2bb8.png)test/CMakeLists.txtcmake_minimum_required(VERSION 2.6)if原创 2022-05-11 21:20:38 · 192 阅读 · 0 评论 -
C++ 11 手写二叉树中序遍历迭代器 [非递归]
本例实现迭代器模式,使用C++11手写二叉树的中序遍历迭代器。程序结构如下,test/CMakeLists.txtcmake_minimum_required(VERSION 2.6)if(APPLE) message(STATUS "This is Apple, do nothing.") set(CMAKE_MACOSX_RPATH 1) set(CMAKE_PREFIX_PATH /Users/aabjfzhu/software/vcpkg/ports/cppwor原创 2022-05-10 14:04:51 · 388 阅读 · 0 评论 -
C++11 使用std::vector改进责任链模式
本例使用STL标准模板库中的std::vector来组织责任链。其他代码逻辑与手写责任链一致。程序目录结构如下,test/CMakeLists.txtcmake_minimum_required(VERSION 2.6)if(APPLE) message(STATUS "This is Apple, do nothing.") set(CMAKE_MACOSX_RPATH 1) set(CMAKE_PREFIX_PATH /Users/aabjfzhu/softwar原创 2022-05-05 15:37:35 · 1084 阅读 · 0 评论 -
C++11 使用boost::signals2库信号槽机制实现责任链
这个其实就是使用C++传统的信号槽机制实现责任链。类似事件处理机制。其中connect函数所在的线程和程序原线程在不同的线程。信号槽机制也不改变原creature对象的值。它只是在信号槽的系统中记录一个当前值而已。在本例中creature对象的值被记录在Query对象的result字段中。程序目录结构如下,程序代码如下,test/CMakeLists.txtcmake_minimum_required(VERSION 2.6)if(APPLE) message(STATUS "This原创 2022-05-05 15:08:53 · 1216 阅读 · 0 评论 -
C++11手写责任链模式 - 更新英雄的属性值
本例实现手写责任链,进行英雄的属性值更新。链表部分使用手写单向链表的形式实现,使用的是尾插法。程序代码结构如下,test/CMakeLists.txtcmake_minimum_required(VERSION 2.6)if(APPLE) message(STATUS "This is Apple, do nothing.") set(CMAKE_MACOSX_RPATH 1) set(CMAKE_PREFIX_PATH /Users/aabjfzhu/software/vcp原创 2022-05-05 15:01:54 · 1065 阅读 · 0 评论 -
C++ 11实现通信代理
本例实现了两种ping模式,一种是本地的ping,一种是remoteping。他们都实现了相同的ping接口。其中remoteping部分连接一个本地的HTTP GET服务,为了简洁起见,没有使用HTTPS(弄证书比较麻烦),使用的是HTTP。程序实现代码如下,两者的对外接口一样,但是实现完全不一样。程序目录结构如下,pingpong_service代码,tests/CMakeLists.txtcmake_minimum_required(VERSION 2.6)if(APPLE)原创 2022-05-05 09:35:27 · 686 阅读 · 0 评论 -
C++ 11实现类似C#的属性语法
C#语言引入了属性的概念,可以在属性set时做一些验证。本例使用C++11的std::function和lambda表达式模拟C#的属性,使用std::function存储验证函数,使用lambda表达式构造验证函数。(本例的思想是使用代理模式实现属性代理)重点关注Property2模板类即可。这是作者在原有代码上的扩展。代码结构如下,test/CMakeLists.txtcmake_minimum_required(VERSION 2.6)if(APPLE) message(STATUS原创 2022-05-04 10:05:08 · 393 阅读 · 0 评论 -
使用享元模式实现字符串格式化
本例实现了两种TextFormatter,用来实现字符串的格式化,就是大写部分字符,当然,第二种字符串格式化方式,通过get_range带来了更多可扩展性和灵活性。程序结构如下,程序具体代码如下,test/CMakeLists.txtcmake_minimum_required(VERSION 2.6)if(APPLE) message(STATUS "This is Apple, do nothing.") set(CMAKE_MACOSX_RPATH 1) set(CMAKE_PRE原创 2022-05-02 20:21:12 · 92 阅读 · 0 评论 -
C++ 11 手写享元模式
所谓享元模式其实就是相同内容的对象,只存储一份,使用不同的指针,或者ID去做索引。本例使用boost::bimap实现手写的享元模式。每次添加对象时,先查询是否存在相同的值,如果存在,则直接返回id,如果不存在,则创建新的对象,并加入bimap。检索时按id进行索引。程序结构如下,test/CMakeLists.txtcmake_minimum_required(VERSION 2.6)if(APPLE) message(STATUS "This is Apple, do noth原创 2022-04-30 09:08:48 · 105 阅读 · 0 评论 -
C++11 外观模式演示
本例摘选自《Design Pattern in Modern C++》一书的外观模式的demo。作者的源码中,Window类和TextBuffer类没有给实现。这里本人使用OpenCV自己实现了写字的Window类和TextBuffer类。本例的绘图系统的设计思路图如下。Text Print System Design最大宽度 和 最大高度取最大宽度 为宽度,取最大高度为高度每次绘制先往下加(最大高度 + 2),接着画Window的宽度为最大宽度Window的高度为 行数 * (最大高度 +原创 2022-04-29 19:29:33 · 2913 阅读 · 0 评论 -
C++ 11使用std::array保存对象属性
本例演示使用std::array保存对象属性。这样在对象的属性较多时,做聚合操作比较简单。程序结构如下test/CMakeLists.txtcmake_minimum_required(VERSION 2.6)if(APPLE) message(STATUS "This is Apple, do nothing.") set(CMAKE_MACOSX_RPATH 1) set(CMAKE_PREFIX_PATH /Users/aabjfzhu/software/vcpkg原创 2022-04-26 15:50:42 · 1004 阅读 · 0 评论 -
C++11 使用CRTP和组合模式模拟神经网络
本例来自《Design Pattern in Modern C++》一书的源码。我做了两处修改。CRTP的SomeNeurons基类的for循环创建连接处,如果直接使用Neuron类作为for循环的参数,需要前置声明,会产生imcompleted type 警告。我改为了auto&NeuronLayer类在原先的附书代码中直接继承自std::vector< Neuron>, 这个不大合适,因为std::vector类的析构函数不是虚函数,子类如果有堆对象需要释放,可能导致子类析构原创 2022-04-26 15:16:46 · 2298 阅读 · 0 评论 -
C++ 11使用静态多态和动态多态实现组合模式
程序目录结构如下, 本例主要实现设计模式中的组合模式,也就是一个对象通过继承或组合来组合多个对象。test/CMakeLists.txtcmake_minimum_required(VERSION 2.6)if(APPLE) message(STATUS "This is Apple, do nothing.") set(CMAKE_MACOSX_RPATH 1) set(CMAKE_PREFIX_PATH /Users/aabjfzhu/software/vcpkg/po原创 2022-04-26 10:54:54 · 206 阅读 · 0 评论 -
C++11 使用智能指针封装 pimpl idom
程序结构如下,本例主要使用std::unique_ptr封装C++常用的pimpl idom,就是在cpp文件中用一个impl来封装细节。实现部分可以随意修改,但是保持接口部分不变。这样一来是节省编译时间。二来是隐藏实现到cpp。程序代码如下,test/CMakeLists.txtcmake_minimum_required(VERSION 2.6)if(APPLE) message(STATUS "This is Apple, do nothing.") set(CMAKE_MA原创 2022-04-25 14:53:31 · 948 阅读 · 0 评论