问题考虑:
数据对象Obj 子类:飞机、坦克、步兵等 参与一些算法、逻辑计算
现在想在屏幕上显示这些对象(部分可见属性:位置...) 为了避免对已有数据对象改动太多,设定新类:
屏幕对象ScrObj 对应数据对象的子类
以下是我的设计想法,但总觉得有疑问,看大家有没有适当方法 我不确定是几点: 1。是由Obj包含ScrObj的引用/指针,还是ScrObj包含Obj好? 2。当Obj的属性改变,最好以什么方式通知屏幕对象?能最大限度避免修改原有结构
3。我考虑使用中介模式,但设计是否过重(因为有许多数据类型,最高可有100多个实例,如何组织好) Mediator* m = new Mediator() Obj* o = new Tank(m) SrcObj* s = new ScrTank( pView, '坦克位图') //pView:战车在这个窗口中显示成一个位图 m.bind(o, s) SrcObjList.append(s) //在第4问题中添加 obj::change(attr){ _attr=attr m->change() } Mediator::change(){ s->change(o->getAttr()) s->draw() }
这种情况下原Obj结构添加中间者指针m,并修改行为change,还算改变不大 (这里有个问题,如果tank和步兵的属性差别太多,导致change行为不能完全抽象到父类,难道要修改子类的change,在那里添加m->change(),这样程序就改的多了,请问还能怎么办?)
当o属性变化o.change(attr)-》m->change()-》s->draw(o->getAttr()) *这样每个屏幕对象,对应1个Obj和1个中介者对象,不算浪费资源吧 如果用C++实现,创建的许多对象指针怎么管理好呢?java倒是省事了
4。考虑view的刷新 在view::Ondraw(pDc){ for srcObj in SrcObjList{ //一个屏幕对象容器 srcObj->setDc(pDc) srcObj->draw() } } srcObj::draw(){ pDc->GetClipbox(&invalidRect) if(invalidRect.intersect(itsRect)){ display(attr.loc, itsBitmap) } }
C++下,SrcObjList可以负责清理屏幕对象,但中介者们怎么办,也用个容器装着是吧?
|
|