运用设计模式设计MIME编码类 -- 兼谈Template Method和Strategy模式的区别
2007-03-16 21:56:45 来源:WEB开发网核心提示: bool UMime::Encode(CString & outTargetStr,const unsigned char * const inSourceBuf,int inSourceBufLen);bool UMime::Decode(CString & outTargetStr,c
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种方案浮现在脑海中:
· 既然整个算法就是将一个Buffer转换成另一个Buffer,写成一个String Class是非常自然的设计
· 用Class的成员变量保存Target Buffer及其长度(因为Buffer中可能有’’),另外提供GetBuf()和GetBufLen()作为查询Target Buffer的接口
· 直接从构造函数传递Source Buffer的信息
该类大概象这样:
class CMimeString
{
public:
enum PROCESSTYPE
{
ENCODING = 0,
DECODING = 1
};
CMimeString(PROCESSTYPE inType, const unsigned char * const inBuf, int inBufLen);
CMimeString(PROCESSTYPE inType, CString & inStr);
virtual ~ CMimeString();
unsigned char * GetBuf( void );
int GetBufLen( void );
operator LPCTSTR() const;
};
哈,似乎很美妙。
更多精彩
赞助商链接