
type
//target interface
IEuroSocket = interface
function GetPower: string;
end;
//existing class with a wrong interface
TUsSocket = class
public
function GetUsPower: string;
end;
//class adapter: inherits the adaptee
//and implements the target
TSocketAdapter = class(TUsSocket,
IEuroSocket)
private
FRefCount: Integer;
public
function GetPower: string;
function QueryInterface(const IID: TGUID;
out Obj): HResult; stdcall;
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
end;
function TUsSocket.GetUsPower: string;
begin
Result := '110V';
end;
function TSocketAdapter.GetPower: string;
begin
Result := GetUsPower + ' as 220V';
end;
function TSocketAdapter.QueryInterface(
const IID: TGUID; out Obj): HResult;
begin
if GetInterface(IID, Obj) then
Result := 0
else
Result := E_NOINTERFACE;
end;
function TSocketAdapter._AddRef: Integer;
begin
Inc(FRefCount);
Result := FRefCount;
end;
function TSocketAdapter._Release: Integer;
begin
Dec(FRefCount);
Result := FRefCount;
end;
var
Socket: IEuroSocket;
begin
Socket := TSocketAdapter.Create;
WriteLn(Socket.GetPower);
//110V as 220V
end.
| Преобразует интерфейс класса в другой интерфейс, ожидаемый клиентами. Обеспечивает совместную работу классов, которая была бы невозможна без данного паттерна из-за несовместимости интерфейсов. |