读书人

嗯, 今天终于用了个貌似Template模式的

发布时间: 2012-03-14 12:01:12 作者: rapoo

嗯, 今天终于用了个貌似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的雏形了。

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

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

读书人网 >C++

热点推荐