| type TZipFile=class(TFileDecorator) private m_ZipFileName:String; public Constructor Create(FileInfo:TFileInfo;FileName:String=''''''''); Destructor Destroy;override; function CompressFile(const SrcFile, DesFile: string;……. ): TCompressResult; //压缩文件 function DeCompressFile(const SrcFile, DesFile: string;………):TCompressResult; //解压文件 procedure OpBaseList(var ls:TStrings);override; //接口依然是这两个,但这个接口什么////都不做 procedure OpFileList;override; // 调用压缩和解压 end; 解释完模式后看看我们怎么运用我们的模式,如图三是制作的这个小工具的界面: 
图三 工具界面 图三是我们的界面,添加完文件后触发打包按钮,Exe文件目录下会出现以文件名称Edit框(Edt_Edition)为文件名的合并文件Edt_Edition.dat文件和压缩文件Edt_Edttion.pag。在windows2000和Delphi7下调试成功,解包过程相反。 点击添加文件后,文件显示列表里会加上所需要的文件,现在的门面功能即是将TEdit盒子里的信息内容写入目标文件A,然后将列表中的文件合并到文件A里面,最后进行压缩。 现在可以定义一个aRead 和aZip 对象 var aREAD:TFileInfoReadIn; aZip:TZipFile; begin aRead:=TFileInfoReadIn.Create(nil,’FileName’); ////////……… aZip:=TZipFile.Create(aRead); //aZip对象添加aRead对象 OperatorFile(aZip); //操纵aZip对象 aRead.Free; aZip.Free; end; 操作文件很简单,调用两个接口函数 procedure TMainFrm.OperatorFile(Obj: TFileInfo); begin obj.OpBaseList(F_Strings); obj.OpFileList; //如果还有其他接口,可以在这里逐个调用 end; 如果根据需要不用压缩文件,很简单,aZip:=TZipFile.Create(aRead)这句去掉即可。又如果我们写出了新的算法去压缩,可以修改TZipFile,也可能的调用方式就是一句aNewZip:=TNewZipFile.Create(aRead);你还可以以这种方式: TFileInfoObj:=TFileInfoA.Create(TFileInfoB.Create(TFileInfoC.Create(…))); 然后调用接口TFileInfoObj.OpFileList; 一句话将所有对象的接口一次全都调用。最重要的是功能可以拆分:例如 TFileInfoObj:=TFileInfoB.Create(TFileInfoC.Create)); TFileInfoObj:=TFileInfoA.Create(nil); TFileInfoObj:=TFileInfoB.Create(TFileInfoA.Create(nil)); //////// 这样功能变成可设计的,就像是搭积木,在接口不合适的地方不要忘了适配器等结构型模式。 小结 事实上,考查一下Delphi的TStream和TMemoryStream,TFileStream,TCompressStream 等本身就是一个极好的装饰样式的实例。
上一页 [1] [2] [3] |