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
- Vistor设计模式
- Java Vistor 设计模式
- 设计模式:访问者模式-vistor
- Java设计模式-访问者模式-Vistor
- 设计模式之访问者模式(Vistor)
- [设计模式-行为型]访问者模式(Vistor)
- 设计模式:访问者模式(Vistor)
- 设计模式:访问者模式(Vistor)
- vistor模式
- 设计模式(3)-访问者模式 Vistor Pattern
- C#设计模式之访问者模式(Vistor Pattern)
- 设计模式拾荒之访问者模式(Vistor Pattern)
- Vistor设计模式续:合并操作,分离思考
- 【设计模式学习笔记二十三】【行为模式】【访问者模式(Vistor)】
- 深入浅出设计模式(十一):16.中介者模式(Mediator) 17.访问者模式(Vistor)
- 读书笔记_java设计模式深入研究 第九章 访问者模式 Vistor
- 23种设计模式(23)_行为型_访问者模式(Vistor Pattern)
- 访问者模式(Vistor Pattern)
- 确定要删除吗
- 一个制作水印的方法
- 直接用socket实现HTTP协议(下载专用)
- T-SQL 2 Tips: 1.计算任意两日期之间的"周一"到"周日"分别各有几个! 2.根据出生日期计算精确年龄!
- 硬盘损坏
- Vistor设计模式
- About log4net
- “C#学习笔记”全面改版,欢迎大家访问!
- 今天我java了吗?
- Vistor设计模式续:合并操作,分离思考
- VC无负担实现XP风格界面
- .NET O/R Mapping
- 2004年8月20日 今天看书写了三个很简单的小程序、
- ResultSet概论