Vistor设计模式

来源:互联网 发布:上海第一人民医院 知乎 编辑:程序博客网 时间:2024/05/02 05:04

从C++的观点来说,有几种代码比较丑陋:

  • 有太多的if else,更过分一点,if else判断在循环+跳转中来回折腾
  • n长的类引用,在MFC中很常见。比如:CStatusBar& statusBar = ((CMainFrame *)(AfxGetApp()->m_pMainWnd))->GetStatusBar();

C中有指针,C++有模板和继承。如果不用指针,就要用数组或者index。如果不懂继承,copy + paste也能过。其实也不要要求太多,没什么大不了的。真正丑陋的地方大家都没办法,只好从小的地方做起了呢。要是任何时候都和Knuth的LP,Tex比起来,我们都不要活了。

转回来,说visitor。Andrew Fitzgibbon说Visitor模式就足可以够设计模式的价钱了。Visitor是为了代替下面这种代码的:void f( objectClass&o )
{
  if( dynamic_cas <objectClass1*>(&o)
    /* do one thing */
  else if( dynamic_cast <objectClass2*>(&o) )
    /* do another thing */
}
俺本质上是个猥琐的人,所以在以前,如果不允许我玩dynamic_cas,我会设置objectClass的时候弄一个structure, 然后define或者const一个各个class的typenumber。这样我就可以if typenumber = = object1 ..... else ....

Gamma他们会愤怒的。

  • 如果可以改动objectClass的源码,用继承,折腾一个virture function:p.DoSomething()
  • 如果不愿意任意改动objectClass的源码,用visitor。

具体步骤:

1 定义一个原来类的visitor类 objectVisitorClass
class objectVisitorClass{
public:
  virtual void Visit( objectClass& ) = 0;
  virtual void Visit( objectClass1& ) ;
  virtual void Visit( objectClass2& ) ;
  virtual void Visit( objectClass3& ) ;
};

2 在object里面增加一个虚函数
virtual void objectClass(1,2)::AcceptVisitor( objectVisitorClass& v )
{ v.Visit( *this ); }

这样,即使你没有权利动Object类,那么你也可以通过改动objectVisitorClass来改动AcceptVisitor函数的功能。

如果仅仅这样,我觉得也没Andrew 说的那么夸张。 设计一个类要花不小的心力,这种技术是比较华丽,不过有什么用呢?

---to be continued

原创粉丝点击