我个人接触设计模式的时间较晚,将它们应用在实际项目中也就这一两年的时间.当时为了快速的学习掌握设计模式,除了参考GoF的<设计模式>之外,还在网上参看了TerryLee的.NET设计模式系列文章,以及程杰的<大话设计模式>,并利用业余时间写了不少C++的例子.此时将它们一一整理发出来,也可以说是对自身的一次总结吧.
设计模式仅仅是模式而已,是一些解决特定问题的方法.世界上不存在通用的问题解决方案,因此才会有23种设计模式,而不是1种.当然,除了这些前人总结出来的优美模式之外,还有很多其他的模式,去解决以上这些模式所无法顺利解决的问题.
优美的使用设计模式,这一点是需要尽量去保证的.何谓优美?一般来讲,能够使问题变得更加简洁清晰,就是一种优美的使用.
如果仅仅为了用而去用设计模式,往往一个问题的解决方案会显得更加复杂与臃肿,充满了牵强附会的结构与关联,此时还不如不用模式.
写程序是能够放松心情的,看简洁清晰的代码会让人赏心悦目.真正的高手写出来的程序,通篇看不出模式的痕迹,整个程序从架构到细节都充满了简明的逻辑.只有将这些模式彻底吸收,并在无意识中融会贯通到程序及架构设计里,才能做到这点.
文中为了避免C++本身繁琐的内存操作,并凸显出各种模式本来的逻辑性,所以所有的指针操作都使用SmartPtr完成(stl里的auto_ptr太鸡肋了,boost::shared_ptr很好,但是我在这里不打算使用boost).
此处给出统一的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"