首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

嗯, 今天终于用了个貌似Template模式的东西,该怎么处理

2012-03-14 
嗯, 今天终于用了个貌似Template模式的东西我是这样用的,不知道是不是Template呢,请耐心看下简单的代码:cl

嗯, 今天终于用了个貌似Template模式的东西
我是这样用的,   不知道是不是Template呢,   请耐心看下简单的代码:

class   XSqlExcutor
{
....
      XSqlSyntax*   pSy;
      void   DoQuery(){     pSy-> Query(this);     };   //调用成员指针的方法.
....
};

class   XSqlSyntax
{
....
      void     Query(XSqlExcutor*   pEx){   DoQuery(pEx);   }   //非虚方法,调用虚方法
private:
      virtual   void   DoQuery(XSqlExcutor*   pEx){   NULL;   }   //虚方法,   空实现  
};

class   XSqlAndPre:public   XSqlSyntax           //一个实现者类
{
  void   DoQuery(XSqlExcutor*   pEx){   ....   }
}

class   XSqlOrPre:public   XSqlSyntax           //又一个实现者类
{
  void   DoQuery(XSqlExcutor*   pEx){   ....   }
}

class   XSqlNotPre:public   XSqlSyntax         //又一个实现者类
{
  void   DoQuery(XSqlExcutor*   pEx){   ....   }
}
....还有一些其它的实现者类,   但不必实现DoQuery方法,   这也是我上面对XSqlSyntax::DoQuery作空实现的原因.

我觉得这个多少跟某种模式相关,   但搞不清算是Strategy,   Template,或者是Adapter了.   看了一段时间的设计模式,   一直没在实际项目中用上.

[解决办法]
似乎是Vistor模式
[解决办法]
楼主高兴太早了。还是再多看看关于模式方面的一些书籍后再说吧。
记住那句话:模式不是解决问题的方法,而是为重构提供了目标
[解决办法]
呵呵,使用公有非虚拟方法调用私有的虚拟方法,也可以称做template method,尤其是你这个公有的非虚拟方法以后还可能会做些其它的工作。Herb Sutter在它自己的书中就是这样说的。

[解决办法]
1、XSqlExcutor调用XSqlSyntax::Query来实现它自己的DoQuery是Proxy模式。其重点在于这个Proxy是可以替换的。
2、XSqlSyntax::Query以XSqlExcutor的指针为参数,与Visitor使用了同样的技术,但是Visitor的主旨是遍历并执行操作。就目前而言看不到遍历的情形。当然从类名可以猜测,XSqlSyntax是帮助做Sql的语法分析的,那么如果对Sql中每个单词都执行某项操作,则一个做成一个Visitor.前提是明确谁是遍历者,谁是访问者(执行操作者)。
3、基类调用虚函数完成某个过程确实是Template Method的标准实现技术。Template Method是指有基类定义不变的流程(即Template),由字类透过虚函数定义变化的每个子步骤。现在虽然只有一个步骤的流程,但是确实已经由Template Method的雏形了。

其实设计模式有不少,也可以自己创造,但是其实现手段只有语言提供的有限几种,如继承,如组合,如多态,等等。设计模式是从使用者解决问题的角度而言的;因此,是否使用某种模式要看它是否为了解决这类问题,而非它是如何实现的。也许你用的方法和某种模式一样,但解决了另外一个问题。那么你就可以骄傲地宣称:“我发明了一种新模式!它可以解决...”而不必将它当作某种模式。

设计模式的核心在于发现并分类问题,而不是它的实现方式。

热点排行