屏幕显示 已有数据对象 时适当的模式

06-11-29 云庭
         

问题考虑:

数据对象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可以负责清理屏幕对象,但中介者们怎么办,也用个容器装着是吧?