- 作者: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