RELATEED CONSULTING
相关咨询
选择下列产品马上在线沟通
服务时间:9:30-18:00
你可能遇到了下面的问题
关闭右侧工具栏
Vistor设计模式
  • 作者:zhaozj
  • 发表时间:2020-12-23 11:02
  • 来源:未知

从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类 objectVisitorClassclass 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