运用设计模式设计MIME编码类 -- 兼谈Template Method和Strategy模式的区别
2007-03-16 21:56:45 来源:WEB开发网核心提示: 是不是有些懊恼?别急,分析问题背后的问题:我们实际上是想用Template Method模式,运用设计模式设计MIME编码类 -- 兼谈Template Method和Strategy模式的区别(5),而且是让构造函数扮演Template Method的角色,而它先天(C++本身决定的)就
是不是有些懊恼?别急。分析问题背后的问题:我们实际上是想用Template Method模式,而且是让构造函数扮演Template Method的角色,而它先天(C++本身决定的)就不是这块料。
现在,摆在面前的至少有2条道路。第1种方法是,坚持使用Template Method模式,但要增加一个接口函数扮演Template Method角色。这样一来,我们使用CMimeString时就不如“直接从构造函数传递参数”方便。第2种方法是,坚持直接从构造函数传递参数,放弃Template Method模式,改用其它模式完成“改变算法”的职责。我决定采用第2种方法。
3、设计成使用Strategy模式的String Class
除了Template Method模式以为,Strategy模式也可以履行“改变算法”的职责,我们就用Strategy模式代替Template Method模式继续完成CMimeString的设计,类图如下:
新的CMimeString的类声明如下:
class CMimeString
{
public:
enum PROCESSTYPE
{
ENCODING = 0,
DECODING = 1
};
enum ENCODETYPE
{
WYMIME = 0,
BASE64 = 1
};
CMimeString(PROCESSTYPE inType, ENCODETYPE inAlgoType, CString & inStr);
CMimeString(PROCESSTYPE inType, ENCODETYPE inAlgoType,
unsigned char * inBuf, int inBufLen);
virtual ~CMimeString();
int GetBufLen(void);
unsigned char * GetBuf(void);
operator LPCTSTR() const;
};
CMimeAlgo的类声明如下:class CMimeAlgo
{
public:
CMimeAlgo();
~CMimeAlgo();
virtual void Encode( unsigned char ** outBuf, int & outBufLen,
unsigned char * inSrcBuf, int inSrcLen );
virtual void Decode( unsigned char ** outBuf, int & outBufLen,
unsigned char * inSrcBuf, int inSrcLen );
};
CBase64Algo的类声明如下:class CBase64Algo : public CMimeAlgo
{
public:
CBase64Algo();
~CBase64Algo();
virtual void Encode( unsigned char ** outBuf, int & outBufLen,
unsigned char * inSrcBuf, int inSrcLen );
virtual void Decode( unsigned char ** outBuf, int & outBufLen,
unsigned char * inSrcBuf, int inSrcLen );
};
具体使用Base64算法是会象这样:CString buf("sdfsdsdfsdfsdf");
CMimeString base64( CMimeString::ENCODING, CMimeString::BASE64, buf );
MessageBox(base64);
哈哈,基本满意。四、使用举例
更多精彩
赞助商链接