CnPack Forum » 技术板块灌水区 » 各位老师,请看下列需求该如何设计?


2011-1-17 14:12 sdshw
各位老师,请看下列需求该如何设计?

各位老师,请看下列需求该如何设计?

有个数据处理类 TDataProcess 负责分析处理数据,处理完成后要交给UI展示数据,
展示的UI要有多种风格

我本来是这样设计的:
IShowUI = interface         //展示数据的接口 比如显示日志数据、显示图像数据等等
   procedure ShowDataA;
    procedure ShowDataB;
  ...
end;

TDataProcess = class

private

public
   UI: IShowUI; //把数据展示做成接口  

end;

TShowUI_1 = class(TForm, IShowUI)
  //实现IShowUI接口
end;

TShowUI_2 = class(TForm, IShowUI)
  //实现IShowUI接口
end;

这样设计,每个展示Form可视化的设计界面并各自去实现接口就可以了
但是,我对接口的了解不是很深刻,特别是关于生存期、释放之类的
所以,我想请问各位老师,如果不使用接口的话,满足该需求该如何设计呢

2011-1-17 21:35 zzzl
规则很简单,引用计数为0时就释放了。

你的设计并不坏啊,但从显示日志和显示图像这两个需求中抽象出接口好象有点困难? 另外,你的TDataProcess 和 IShowUI 好象是在一个线程里的,这样如果以后要把 TDataProcess 放到线程中,就要小心VCL同步的问题。

最简单的方法是让TDataProcess 给UI发消息,数据包就是消息参数。

2011-1-17 23:02 Passion
如果如楼上所说能抽象出共同的接口,那还是用接口优雅些。或者用抽象虚基类,但本质上和接口也是类似的,只不过Delphi不支持多重继承,所以还是接口方便。IDE的对外开放的OpenTools API都是通过接口实现的。

2011-1-17 23:07 sdshw
回复 #2 zzzl 的帖子

多谢zzzl老师的耐心指导

针对我的问题,说白了我就是想让数据处理和展示分层,并且有多种展示风格
每个UI展示的数据是一样的(我理解为比如接口中有10个函数,就是展示10类数据)

另外,TDataProcess确实是工作在线程中的(使用了Indy的IdTcpServer,每个Client一个线程,大约200个Client)
线程中我已做过同步处理(Synchronize),但是感觉处理的相当别扭
因为Synchronize传递参数很不方便,必须为每类数据放一个成员变量

用发消息的方式确实是个好办法,但是UI在相应消息的时候,必须要清楚传递的数据结构,感觉稍微有点不爽 呵呵

2011-1-17 23:13 sdshw
回复 #3 Passion 的帖子

LiuXiao老师,抽象虚基类您指的是带virtual; abstract;关键字的吗?

2011-1-18 18:53 Passion
对。不过Delphi低版本中没有纯的虚基类的说法,virtual abstract一般是指抽象虚方法。
应用起来就是这个意思。

页: [1]


Powered by Discuz! Archiver 5.0.0  © 2001-2006 Comsenz Inc.