适配器模式的主要意图是对现有类的接口进行转换,以满足目标类的需求。其次,可以给目标类的接口添加新的行为(主要指方法)。这一点容易与装饰模式混淆。从意图方面来看,装饰模式不改变(通常指增加)接口中的行为(主要指方法),而是在原有行为(主要指方法)的基础上添加新的功能;从类结构方面来看,装饰模式中的装饰者既继承又组合被装饰者。类适配器同时继承现有类和目标类,对象适配器继承目标类组合现有类。
1

2
{《HeadFirst设计模式》之适配器模式 }3
{ 现有类 }4
{ 编译工具:Delphi7.0 }5
{ E-Mail :guzh-0417@163.com } 6

7
unit uAdaptee;8

9
interface10

11
type12
TTurkey = class(TObject)13
public14
procedure Gobble; virtual; abstract;15
procedure Fly; virtual; abstract;16
end;17

18
TWildTurkey = class(TTurkey)19
public20
procedure Gobble; override;21
procedure Fly; override;22
end;23

24
implementation25

26
{ TWildTurkey }27

28
procedure TWildTurkey.Fly;29
begin30
Writeln('I''m flying a short distance.');31
end;32

33
procedure TWildTurkey.Gobble;34
begin35
Writeln('Gobble gobble.');36
end;37

38
end.
1

2
{《HeadFirst设计模式》之适配器模式 }3
{ 目标类 }4
{ 编译工具:Delphi7.0 }5
{ E-Mail :guzh-0417@163.com }6

7
unit uTarget;8

9
interface10

11
type12
TDuck = class(TObject)13
public14
procedure Quack; virtual; abstract;15
procedure Fly; virtual; abstract;16
end;17

18
TMallarDuck = class(TDuck)19
public20
procedure Quack; override;21
procedure Fly; override;22
end;23

24
implementation25

26
{ TMallarDuck }27

28
procedure TMallarDuck.Fly;29
begin30
Writeln('I''m flying.');31
end;32

33
procedure TMallarDuck.Quack;34
begin35
Writeln('Quack.');36
end;37

38
end.1

2
{《HeadFirst设计模式》之适配器模式 }3
{ 适配器,转换现有类的接口 }4
{ 编译工具:Delphi7.0 }5
{ E-Mail :guzh-0417@163.com }6

7
unit uAdapter;8

9
interface10

11
uses12
uTarget, uAdaptee;13

14
type15
TTurkeyAdapter = class(TDuck)16
private17
FTurkey: TTurkey;18
public19
constructor Create(aTurkey: TTurkey);20
procedure Quack; override;21
procedure Fly; override;22
end;23

24
implementation25

26
{ TTurkeyAdapter }27

28
constructor TTurkeyAdapter.Create(aTurkey: TTurkey);29
begin30
FTurkey := aTurkey;31
end;32

33
procedure TTurkeyAdapter.Fly;34
var35
i: Integer;36
begin37
for i := 0 to 4 do38
begin39
FTurkey.Fly;40
end;41
end;42

43
procedure TTurkeyAdapter.Quack;44
begin45
FTurkey.Gobble;46
end;47

48
end.1

2
{《HeadFirst设计模式》之适配器模式 }3
{ 客户端 }4
{ 编译工具:Delphi7.0 }5
{ E-Mail :guzh-0417@163.com }6

7
program pDuckTestDrive;8

9
{$APPTYPE CONSOLE}10

11
uses12
SysUtils,13
uAdaptee in 'uAdaptee.pas',14
uAdapter in 'uAdapter.pas',15
uTarget in 'uTarget.pas';16
17
var18
Duck : TMallarDuck;19
Turkey: TWildTurkey;20
TurkeyAdapter: TTurkeyAdapter;21

22
procedure TestDuck(aDuck: TDuck);23
begin24
aDuck.Quack;25
aDuck.Fly;26
end;27

28
begin29
Duck := TMallarDuck.Create;30
Turkey := TWildTurkey.Create;31
TurkeyAdapter := TTurkeyAdapter.Create(Turkey);32

33
Writeln('The turkey says:');34
Turkey.Gobble;35
Turkey.Fly;36

37
Writeln;38

39
Writeln('The duck says:');40
TestDuck(Duck);41

42
Writeln;43

44
Writeln('The turkeyAdapter says:');45
TestDuck(TurkeyAdapter);46

47
FreeAndNil(Duck);48
FreeAndNil(Turkey);49
FreeAndNil(TurkeyAdapter);50

51
Readln;52
end.运行结果: