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

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