正在学习模式设计,属于超级菜鸟那种大家表笑哈
用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;
  procedure DownLoad(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;
  procedure DownLoad(AFileName: String);override; 
end;