运用设计模式设计MIME编码类

2016-01-29 12:21 8 1 收藏

运用设计模式设计MIME编码类,运用设计模式设计MIME编码类

【 tulaoshi.com - C语言心得技巧 】

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

下载本文示例源代码

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

一、背景知识

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com)

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个接口函数。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com)

好像还不错?高兴得太早了。因为将来应用中很可能出现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种方

来源:https://www.tulaoshi.com/n/20160129/1485696.html

延伸阅读
泼溅可以用于网站和图形设计以制作有趣的可以吸引用户的注意力的效果。本文中我们将展示很多来自于各种不同类型的设计的实例。在你的项目中使用这种效果的最简单的方法是发挥Photoshop笔刷的优势,这可以大大的减轻你的工作量并快速创建酷炫的泼溅效果。 1.Nike 2.Technix 3.Design Was Here 4.Chaotic Typo 5.Colours 6....
  program singletonTest; uses   Forms,   mainfrm in 'mainfrm.pas' {Form1},   singletonfrm in 'singletonfrm.pas' {Form2}; {$R *.res} begin   Application.Initialize;   Application.CreateForm(TForm1, Form1);   Application.Run; ...
活动类网页,故名思意是专门一些网站线上与线下开展活动的宣传网页,很多时候我们都会参照海报的设计方式来对这类网页进行设计,当然虽然如此不过网页总归与海报是有区别的,有时候我们在设计此类网页时反而无从下手,不知道该注意点什么,本文中的一些经验可能会为你解决设计活动网页的困扰。 在WEB2.0 网页充斥的年代,身边无时无刻都听到这...
什么是模式,这是一个看上去简单,但是又非常不简单的问题。我见过很多人,学习模式理论已经很长时间了,但是并不真正理解这一点。 !-- frame contents -- !-- /frame contents -- 模式理论的基本思想其实起源于中国,是中国文化的固有思想。你,我,我们中每一个自幼受到中国思想熏陶的人,都自然具有这一基本思想。模式...
本教程介绍艺术设计类海报制作。这类海报非常究竟,完全用艺术来表达设计。从效果图可以看出画面构图明快,文字布局视觉效果突出,虽然用到的元素不多,表现的空间张力是非常巨大的。 最终效果 1、生成一个600 * 800像素文件,将背景层添充为深褐色。 2、设置背景色为黑色前景色为白色,选择背景层并执行“滤镜”/“纹理”/“纹理化...

经验教程

431

收藏

61
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部