当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 运用设计模式设计MIME编码类

VC++
在类VC的界面实现中加入目录树
软件换肤技术在 BCB 中的实现
利用非模窗口生成MDI介面
报表输出轻松搞定
Windows 中不规则窗体的编程实现
解说Win32的窗口子类化
使用测试优先方法开发用户界面
一个简单的登录对话框的实现
一个简单的日记本程序
从资源中加载皮肤
一个在RichEdit中添加表情图象的类
ActiveSkin 4.3 软件换肤在VC中的实现
一种另类“关于(About)”对话框的动态显示方法
对话框打印预览及打印
关于如何换肤、子类化的解决方案
制作 MSN、QQ 的消息提示窗口
如何对 BCGControlBarPro 进行换肤
定制个性化的对话框窗口类
改变窗口中的光标形状
更新MFC中的视图,跟踪.NET Framework中的事件

VC++ 中的 运用设计模式设计MIME编码类


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 121 ::
收藏到网摘: n/a

运用设计模式设计MIME编码类 -- 兼谈Template Method和Strategy模式的区别
作者: 温昱 (lcspace.nease.net)

下载本文示例源代码

本文讲述可重用、易扩充的MIME编码类的设计思路;并顺便对比了Template Method和Strategy模式的区别。

一、背景知识

MIME是一种Internet协议,全称为“Multipurpose Internet Mail Extensions” ,中文名称为“多用途互联网邮件扩展”。其实,它的应用并不局限于收发Internet邮件——它已经成为Internet上传输多媒体信息的基本协议之一。本文仅关心MIME的编码算法。

MIME编码的原理就是把 8 bit 的内容转换成 7 bit 的形式以能正确传输,在接收方收到之后,再将其还原成 8 bit 的内容。对邮件进行编码最初的原因是因为 Internet 上的很多网关不能正确传输8 bit 内码的字符,比如汉字等。MIME编码共有Base64、Quoted-printable、7bit、8bit和Binary等几种。

Base64算法将输入的字符串或一段数据编码成只含有{''A''-''Z'', ''a''-''z'', ''0''-''9'', ''+'', ''/''}这64个字符的串,''=''用于填充。其编码的方法是,将输入数据流每次取6 bit,用此6 bit的值(0-63)作为索引去查表,输出相应字符。这样,每3个字节将编码为4个字符(3×8 → 4×6);不满4个字符的以''=''填充。

Quoted-printable算法根据输入的字符串或字节范围进行编码,若是不需编码的字符,直接输出;若需要编码,则先输出''='',后面跟着以2个字符表示的十六进制字节值。

二、设计目标

我们计划开发一套MIME编码和解码的类,适用于可以想到的多种应用场合:
· Email客户端程序
· 乱码察看程序
· 图片等二进制对象存入XML文件

设计目标如下:
· 可重用
· 易使用
· 易扩充

三、设计过程

本部分分为下面3节,注意它们不是并列的3种设计方案,而是达到趋于合理的设计的思考过程:
· 设计成仅提供方法的Utility
· 设计成使用Template Method模式的String Class
· 设计成使用Strategy模式的String Class

1、设计成仅提供方法的Utility

首先跳进我脑子的想法就是设计成Utility(仅仅提供方法的类),我想可能是我受C影响太大的缘故吧。

它的接口会是什么样子呢?差不多象

bool UMime::Encode(unsigned char * outTargetBuf,	int & outTargetBufLen,	const unsigned char * const inSourceBuf,	int inSourceBufLen);bool UMime::Decode(unsigned char * outTargetBuf,	int & outTargetBufLen,	const unsigned char * const inSourceBuf,	int inSourceBufLen);
吧。不行,为了满足易使用要求,应该支持CString类型的buffer吧,再增加2个接口函数
bool UMime::Encode(CString & outTargetStr,CString & inSourceStr);bool UMime::Decode(CString & outTargetStr,CString & inSourceStr);
这样以来,UMime一共包括4个接口函数。

好像还不错?高兴得太早了。因为将来应用中很可能出现CString和unsigned char *协同工作的情形。比如应用从XML文件中读出一个字符串放到一个CString型变量中,而这个字符串是一个Bmp图片的MIME编码,它解码过后自然应放到unsigned char *的buffer中。所以我们还要增加下面4个接口函数:

bool UMime::Encode(CString & outTargetStr,	const unsigned char * const inSourceBuf,	int inSourceBufLen);bool UMime::Decode(CString & outTargetStr,	const unsigned char * const inSourceBuf,	int inSourceBufLen);bool UMime::Encode(unsigned char * outTargetBuf,	int & outTargetBufLen,	CString & inSourceStr);bool UMime::Decode(unsigned char * outTargetBuf,	int & outTargetBufLen,	CString & inSourceStr);
以免用户类型转换之苦。

啊哈,这么8个极为相似的接口函数搅在一起,好像一团麻呀。可重用性似乎满足了,但易使用性和易扩展性完全谈不上。

2、设计成使用Template Method模式的String Class

第2种方案浮