关于模式设计的菜问题,给点建议(28分)

D

dropme

Unregistered / Unconfirmed
GUEST, unregistred user!
正在学习模式设计,属于超级菜鸟那种。。。大家表笑哈
用indyFtp做一个Ftp的下载客户端,设计成酱子
FTPEngine
|
|继承
|
IndyFTPEngine-----ThreadIndyFTPEngine
包含
FTPEngine是一个接口基类,抽象纯虚的,定义了DownLoad,UpLoad等方法
IndyFTPEngine继承自接口,本来这样就可以,但是一般都是把IndyFTP放到线程里面用的,这样界面不会freeze,所以有了ThreadIndyFTPEngine。
这样设计的话,上层只要用FTPEngine就可以,假如以后要换用ICS,或者从Indy9换到Indy10,上层都不用改,只要重写个ICSFTPEngine/Indy10FTPEngine和TreadICSFTPEngine/Indy10FTPEngine,基本做到代码重用(希望是酱子)
1.请教下这样设计是否合理,如果不合理的话应该怎样?或者说常用的做法是怎样的?
2.这种设计遇到个困难,就是状态反馈,假如说我要在界面上显示下载的即时速度,那么一般是在IndyFTP的OnWork事件里统计,这样设计后,要怎么才能反馈给主界面呢?
示例代码:
TFTPEngine = class
public
procedure UpLoad(AFileName: String);virtual;abstract;
proceduredo
wnLoad(AFileName: String);virtual;abstract;
end;

TThreadIndyFtpEngine = class(TThread)
protected
procedure Execute;
public
procedure Create(AFileName: String;Operation: Integer);
//AFileName: 文件名
//Operation: 要执行的操作
end;

TIndyFTPEngine = class(TFTPEngine)
private
FEngine: TThreadIndyFtp;
public
procedure UpLoad(AFileName: String);override;
proceduredo
wnLoad(AFileName: String);override;
end;

只剩这点分了,8好意思的说~
 
D

dropme

Unregistered / Unconfirmed
GUEST, unregistred user!
米人??为虾米的说?
 

天空还下着沙

Unregistered / Unconfirmed
GUEST, unregistred user!
在你的TIMER里去读取它的进度属性,行么
 
H

HAZL

Unregistered / Unconfirmed
GUEST, unregistred user!
状态返馈用观察者模式。
 
1

1295118971

Unregistered / Unconfirmed
GUEST, unregistred user!
QQ: 251502563,可以共同探讨吗?
 
J

jhwh

Unregistered / Unconfirmed
GUEST, unregistred user!
这样的设计不对
 
K

kidneyball

Unregistered / Unconfirmed
GUEST, unregistred user!
1.请教下这样设计是否合理,如果不合理的话应该怎样?或者说常用的做法是怎样的?
既然考虑到版本更替与改用其他控件的问题,IndyFTPEngine那里可以考虑使用个template模式。把一般性的FTP操作框架作为模板。与IndyFTP控件相关的代码放在子类中实现。
2.这种设计遇到个困难,就是状态反馈,假如说我要在界面上显示下载的即时速度,那么一般是在IndyFTP的OnWork事件里统计,这样设计后,要怎么才能反馈给主界面呢?
可以用个Observer模式的变体:
进度条类 <--------- TFTPObservee(实现类)

(UI包) │ (实现)
--包边界-------------------╋-----------------
(业务包) │

IndyFTPEngine ◆-----> IFTPObservee(接口)
设计要点:
1. IFTPObservee中定义Processed(percentage : integer)方法。参数percentage为0-100整数,表示当前进度的百分数。
2. 在UI部分定义IFTPObservee的实现类TFTPObservee。实现Processed()的操作是改动进度条并reflash()
3. 在IndyFTPEngine中定义到IFTPObservee的引用Observee
4. 在IndyFTPEngine.OnWork中对Observee.Processed()发信息
5. 在界面代码中建立IndyFTPEngine与TFTPObservee的关联 (IndyFTPEngine.Observee := TFTPObservee.create())。注意,因为TFTPObservee属于界面包,因此业务包中不能直接引用。大原则是,界面包可见(aware of)业务包,但业务包不可见(unaware of)界面包
 
D

dropme

Unregistered / Unconfirmed
GUEST, unregistred user!
前几天太忙。。。。后来一个高手给实现了。。。就是用事件一层一层的给反馈回去。。。
 
D

duhai_lee

Unregistered / Unconfirmed
GUEST, unregistred user!
其实我觉得你的TFTPEngine 只是个接口。 但你设计成纯虚的也可以。
我认为主要业务由TThreadIndyFtpEngine 及其派生类来实现, TFTPEngine已接口的方式出现比较好。。
 
L

linuxping

Unregistered / Unconfirmed
GUEST, unregistred user!
观察者模式--‘主题’向‘观察者‘notify。
这可以通知窗体(‘观察者‘)onwork事件发生了,但窗体无法在接到通知时改变progress的position。
 
C

cwhelucky

Unregistered / Unconfirmed
GUEST, unregistred user!
直接在该界面里修改主界面的进度条的内容,然后主窗体update就可以了,我做过类似的东西,例如:
f_main.progress1.position:=value
f_main.update
这样就可以看到主界面的进度条的变化,如果要在主界面响应别的事件的话,那么需要多线程来处理
不知道说的对不对,可能驴头不对马嘴了,呵呵
 
C

cqwty

Unregistered / Unconfirmed
GUEST, unregistred user!
http://www.delphibbs.com/keylife/iblog_show.asp?xid=25141
http://www.delphibbs.com/keylife/iblog_show.asp?xid=25159
我收藏的两篇关于模式设计的delphi实现,希望对你有用.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
518
import
I
I
回复
0
查看
607
import
I
顶部