|
最近在写场景系统,又写了半个月,重写了2次,感触颇多.
在所有的设计当中,让我感触最深的就是委托的思想.
因为有了这个设计,所有的对象都将变的simple.
我举个简单的例子,比如我这个人,要吃饭,那我需要自己种菜吗?我要睡觉,我需要自己做床么?我要开车,我需要自己造车么?我要看病,我需要自己去做药么?显然都不会,我只所以存在,只是做程序而已,所以要描述我这个人,其实只用描述我是一个程序就OK了.
那么设计类的时候也是如此,比如一个Edit控件类,他在游戏里只是输入和显示的功能,一个摄象机类,他只是用来固定视角用的,其他的方面他们都不要去管.
不管是场景也好,UI也好,都需要动态创建,那么动态创建的话就需要从配置文件中将属性的值读入,那么读入写入属性数值这些事情是不是这些类要实现的呢?
刚开始我确实让这些类自己实现自己数值的读写,后来觉得太多余了,于是去掉了,直接将这些事情委托给IO组件去完成.
那怎么委托呢?
想想我们现实社会中是怎么委托的就很简单了.一个人要委托另一个人做事情,只要告诉他要完成的事情的信息和要求就可以了.
比如,我做了一些运动类,有Bezier曲线运动,圆周运动,等,当我的摄象机要做bezier运动的时候,直接将摄象机对象委托给Bezier就可以了,只需要告诉他,起点哪里,终点哪里,中间有多少个顶点需要插值,那么Bezier对象自己会计算出运动路线,根据摄象机自己固有的速度,完成整个运动过程.当然其他对象也可以委托Bezier对象完成这个动作.
还有关于属性值的读写,这个是非常重要的一个部分,因为不管是游戏里,还是其他编辑器都需要实现这个.
我特地将一个对象与他的属性分离开来,一个对象拥有一个属性对象的指针,到时候创建出自己的属性就可以了.
分离出属性的目的就是想让属性拥有自己的继承关系.
这样比如Wnd窗口类,如果要实现委托的话就简单了,只需要告诉IO组件,读或写,属性列表跌代器,就可以了.
Wnd::porperty pPPt = MyWnd.Porperty();
io::XMLReader( pPPt , xmlElement );
io::XMLWrite( pPPt, xmlElement );
也可以这样.
io::Reader ReaderObj.push( Task( pPPt, xmlElement ) );
建一个委托事物列表.
我知道委托这个东西由来以久,只是以前都没有真正接触过,没用到过.我现在觉得这个东西在对象众多的系统中特别有用,能将每个对象变成更简单.粒度更小的对象.
[em2] [em17] |
|