类设计问题(100)

  • 主题发起人 主题发起人 小飞龙
  • 开始时间 开始时间

小飞龙

Unregistered / Unconfirmed
GUEST, unregistred user!
我有2个类,A和B。A类有中有一个B类的成员变量。而B类却只需要使用A类提供的一个接口而已。具体情况其实A类是一个通信类,负责收发数据,支持多种协议。B类是具体某种协议的封装。可能还有C、D...等类封装了其他协议。但是B(C、D...)类中需要用到A类提供的发送数据的接口。请问有什么设计模式适合这种情况吗?或者有什么比较好的设计方案吗?
 
B类定义一个事件呗,A类把方法做为事件过程传入
 
应该使用IInterface方式,去看看TComponent是怎么写的,你就不会问这种问题了.
 
其实没有必要这么复杂,举个例子{统一的接口,当然也可以使用抽象类来作为接口}IConnection = interface procedure Write
procedure Read;end;{这是你的B,C,D……}TCOMConnection = class(TInterfacedObject, IConnection)public procedure Write
procedure Read;end;{这也是你的B,C,D……之一}TTcpipConnection = class(TInterfacedObject, IConnection)public procedure Write
procedure Read;end;具体的使用var TmpConnection: IConnection
{这是你的A}begin TmpConnection := TCOMConnection.Create()
{这里根据你的具体情况来创建合适的接口} 实际上这都谈不上设计模式,只是多态的运用。另外如果要对对象的创建做一个控制,可以使用工厂模式,比如TConnectFactory = class class function CreateInstance(const AConnectParam: string): IConnection;……这样你就可以这么使用比如 TConnectFactory.CreateInstance('Tcpip').write……
 
这个问题和食堂打饭的例子有一点点类似吧: 很多不同的师傅在不同的窗口,然后我们要打干饭稀饭小面什么的就到相应的窗口,打完就带着饭就回寝室慢慢吃[:D].如果非要找例子的话,参考 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属性
 
后退
顶部