WEB开发网
开发学院软件开发VC 运用设计模式设计MIME编码类 -- 兼谈Template M... 阅读

运用设计模式设计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);
哈哈,基本满意。

四、使用举例

上一页  1 2 3 4 5 6 7  下一页

Tags:运用 设计模式 设计

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接