Published by orzz.org(). (http://orzz.org/cpp%e8%ae%be%e8%ae%a1%e6%a8%a1%e5%bc%8f%e4%b9%8b%e5%89%8d%e8%a8%80/)
我个人接触设计模式的时间较晚,将它们应用在实际项目中也就这一两年的时间.当时为了快速的学习掌握设计模式,除了参考GoF的<设计模式>之外,还在网上参看了TerryLee的.NET设计模式系列文章,以及程杰的<大话设计模式>,并利用业余时间写了不少C++的例子.此时将它们一一整理发出来,也可以说是对自身的一次总结吧.
设计模式仅仅是模式而已,是一些解决特定问题的方法.世界上不存在通用的问题解决方案,因此才会有23种设计模式,而不是1种.当然,除了这些前人总结出来的模式之外,还有很多其他的模式,去解决以上这些模式所无法顺利解决的问题.
设计模式在使用上充满了技巧.如果仅仅为了用而去用模式,往往一个问题的解决方案会显得更加复杂与臃肿,充满了牵强附会的关联.使用模式的目的是使问题变得更加简洁而清晰,整体结构更加优美而有序.
写程序是能够放松心情的,看简洁清晰的代码会让人赏心悦目.真正的高手写出来的程序,通篇看不出模式的痕迹,整个程序从架构到细节都充满了简明的逻辑.只有将这些模式彻底吸收,并在无意识中融会贯通到程序及架构设计里,才能做到这点.
文中为了避免C++本身繁琐的内存操作,并凸显出各种模式本来的逻辑性,所以所有的指针操作都使用SmartPtr完成(stl里的auto_ptr太鸡肋了,boost::shared_ptr很好,但是代码主要以示意为主,所以我在这里不打算使用标准C++以外的库:).
整个工程的所有项目采用统一的预编译头,方便整体控制.此处给出统一的stdafx.h文件内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
// stdafx.h : 标准系统包含文件的包含文件, // 或是经常使用但不常更改的 // 特定于项目的包含文件 // #pragma once // 操作系统版本号定义 #ifndef _WIN32_WINNT // 允许使用特定于 Windows XP 或更高版本的功能。 #define _WIN32_WINNT 0x0501 // 将此值更改为相应的值,以适用于 Windows 的其他版本。 #endif // 标准库支持 #include <stdio.h> #include <tchar.h> // stl标准库支持 #include <iostream> #include <string> #include <vector> #include <list> #include <map> #include <algorithm> using namespace std; // stl unicode 支持 #ifdef _UNICODE #define _tstring wstring #define _tcin wcin #define _tcout wcout #define _tcerr wcerr #define _tclog wclog #define _tsystem _wsystem #else /* ndef _UNICODE */ #define _tstring string #define _tcin cin #define _tcout cout #define _tcerr cerr #define _tclog clog #define _tsystem system #endif /* _UNICODE */ // 内存泄漏检测 #ifdef _DEBUG #define _CRTDBG_MAP_ALLOC #include <stdlib.h> #include <crtdbg.h> #define DBG_NEW new( _NORMAL_BLOCK, __FILE__, __LINE__) #define new new( _NORMAL_BLOCK, __FILE__, __LINE__) #else #define DBG_NEW new #endif // _DEBUG // 外部功能类支持 #include "SmartPtr.h" |