Wrapper設計模式能夠把一個類的接口修改成另一個類所需要的接口,然後讓本來因為接口不兼容的類能夠在一起配合工作。
在 Delphi中,為了讓兩個類能夠支持同樣的接口,它們必須有同樣的祖先類這樣才能在其他類調用的時候實現多態性。但是有的時候我們希望兩個沒有關系的類 能夠在一起工作,Wrapper設計模式就能夠讓一個類wrap部分另一個類的部分接口(當然也可以是全部,看具體的需要而定),從而能夠模擬出一個類似 於“uses”的類的多繼承關系。
讓我們來看一個例子,有一個類TSimple從TObject繼承下來,但是我們希望能把 TSimple這個類放到Delphi的控件面板(component palette)上,然而我們知道,如果一個類能夠放置到控件面板上,這個類必須從TComponent派生下來。現在我們不想在改變TSimple的祖 先類TObject的情況下(比如我們並沒有TSimple的源代碼)把TSimple放到控件面板上,我們可以構建一個繼承自TComponent的 TSimpleWapper類,在TSimpleWapper類中Wrap TSimple的接口。下面是這個例子的范例代碼:
type
TSample = class (TObject)
private
FSomeValue: Integer;
public
function SomeAction(const Data: string): Boolean;
property SomeValue: Integer read FSomeValue write FSomeValue;
end;
TSampleWrapper = class(TComponent)
private
FSample: TSample;
public
property Sample: TSample read FSample;
end;
然後我們就可以在TSample類中實現TSample的接口了,代碼如下:
TSampleWrapper = class (TComponent)
private
FSample: TSample;
protected
function GetSomeValue: Integer;
procedure SetSomeValue(Value: Integer);
public
function SomeAction(const Data: string): Boolean;
property Sample: TSample read FSample;
property SomeValue: Integer read GetSomeValue write SetSomeValue;
接口實現代碼如下:
function TSampleWrapper.GetSomeValue: Integer;
begin
Result := Sample.SomeValue;
end;
procedure TSampleWrapper.SetSomeValue(Value: Integer);
begin
Sample.SomeValue := Value;
end;
function TSampleWrapper.SomeAction(const Data: string): Boolean;
begin
Result := Sample.SomeAction(Data);
end;