这个问题和食堂打饭的例子有一点点类似吧: 很多不同的师傅在不同的窗口,然后我们要打干饭稀饭小面什么的就到相应的窗口,打完就带着饭就回寝室慢慢吃[
].如果非要找例子的话,参考 TDATASOURCE 以及TADODATASET ,TQUERY等不同的数据集之间的关系.首先定义一个传输类,相当于去食堂打饭的人TTranslator=classprivated FEncoderList:TList;public procedure RegistorEncoderLink(Encoder:TSimpleEncoder)
...public procedure Send(buff:TMemoryStream;EncoderID:Integer);end;procedure TTranslator.RegistorEncoderLink(Encoder:TSimpleEncoder);begin FEncoderList.Add(Encoder);end;procedure TTranslator.Send(buff:TMemoryStream;EncoderID:Integer);var I:Integer;begin for I:=0 to FEncoderList.Count-1 do //找出支持某协议的对象 if TSimpleEncoder(FEncoderList.Items
). Support(EncoderID) then begin TSimpleEncoder(FEncoderList.Items).Encode(buff)
SendStream(buff)
endend;//每个协议实现编/解码,可以提供一个公共的传输对象//协议类,TSimpleEncoder=classprivated FTranslator:TTranslator
procedure SeTransLator(value:TTranslator);public function Support(EncoderID:Integer):boolean;virtual
function Encode(var Data:TMemoryStream):integer;virtual;public procedure Translator:TTranslator read FTranslator write SeTransLator;end;procedure TSimpleEncoder.SeTransLator(value:TTranslator);begin FTranslator:=value
Value.RegistorEncoderLink(Self);end;function TSimpleEncoder.Support(EncoderID:Integer):boolean;begin result:=true;// 返回是否支持某协议end;function TSimpleEncoder.Encode(var Data:TMemoryStream):integer;begin//协议处理end;然后 BCD 从TSimpleEncoder继承,改写自己的Encoder,以及Support ,和Translator属性