| procedure TFileDecorator.OpFileList; begin // inherited; if m_FileInfo<> nil then m_FileInfo.OpFileList; end; 看起来构造器中传进来的对象开始发生作用。好,接下来的工作是实现三个功能类,实际的代码将放在功能类中: type TFileInfoReadIn=class(TFileDecorator) protected procedure WriteAFileIn(FilePathName:String); //写入一个文件 public constructor Create(FileInfo:TFileInfo;FileName:String); // procedure OpBaseList(var ls:TStrings);override; //操纵信息列表 procedure OpFileList;override; //操纵所有文件 end; type TFileInfoReadOut=class(TFileDecorator) public constructor Create(FileInfo:TFileInfo;FileName:String); procedure OpBaseList(var ls:TStrings);override; procedure OpFileList;override; end; 现在看实现类TFileInfoReadIn.OpFileList函数,怎样操纵文件: procedure TFileInfoReadIn.OpFileList; var I:Integer; begin inherited; //继承功能 m_Writer.WriteInteger(m_FileList.Count);//写入文件的个数 for I:=0 to m_FileList.Count-1 do begin WriteAFileIn(m_FileList.Strings[I]); //根据文件全路径写入文件 end; if Assigned(m_Writer) then FreeAndNil(m_Writer); if Assigned(m_FileStream) then FreeAndNil(m_FileStream); end; WriteAFileIn函数实现: procedure TFileInfoReadIn.WriteAFileIn(FilePathName: String); var ReadInt:Integer; FSource:TFileStream; begin FSource:=TFileStream.Create(FilePathName,fmOpenRead); //这里重新创建文件输入流 m_Writer.WriteInteger(FSource.Size); //写入文件的长度 m_Writer.WriteString(ExtractFileName(FilePathName)); //写入文件名 repeat ReadInt:=FSource.Read(m_buffer^,BUFFER_SIZE); //源文件内容读入缓冲 m_Writer.Write(m_Buffer^,ReadInt); until ReadInt<BUFFER_SIZE;//文件的内容 //重复读取写入文件过程 FreeAndNil(FSource); //释放文件流 end; 至于TFileInfoReadOut类的OpFileList实现函数,和TFileInfoReadIn过程相反,这里就不列出了,具体看源代码。 关键还在于第三个类TZipFile,这个类,实现了文件的压缩和解压,首先单元里加上ZLib单元,这样我们可以利用TCompressStream类来实现文件流的压缩和解压,这里有一个问题,TZipFile类利是其他的程序员交付过来的,接口并不统一,但是适配器模式可以让我们很好地解决这类问题。 
图二 为装饰类加入适配器 图二所示,TZipFile包含了CompressFile()和DeCompressFile()函数,而接口OpBaseList和OpFileList不变,实际上TZipFile可以被称为适配器。 上一页 [1] [2] [3] 下一页 |