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

 1
 2{《HeadFirst设计模式》之适配器模式 }
 3{ 现有类                         }
 4{ 编译工具:Delphi7.0             }
 5{ E-Mail :guzh-0417@163.com     } 
 6
 7unit uAdaptee;
 8
 9interface
10
11type
12  TTurkey = class(TObject)
13  public
14    procedure Gobble; virtual; abstract;
15    procedure Fly;    virtual; abstract;
16  end;
17
18  TWildTurkey = class(TTurkey)
19  public
20    procedure Gobble; override;
21    procedure Fly;    override;
22  end;
23
24implementation
25
26{ TWildTurkey }
27
28procedure TWildTurkey.Fly;
29begin
30  Writeln('I''m flying a short distance.');
31end;
32
33procedure TWildTurkey.Gobble;
34begin
35  Writeln('Gobble gobble.');
36end;
37
38end.
 1
 2{《HeadFirst设计模式》之适配器模式 }
 3{ 目标类                         }
 4{ 编译工具:Delphi7.0             }
 5{ E-Mail :guzh-0417@163.com     }
 6
 7unit uTarget;
 8
 9interface
10
11type
12  TDuck = class(TObject)
13  public
14    procedure Quack; virtual; abstract;
15    procedure Fly;   virtual; abstract;
16  end;
17
18  TMallarDuck = class(TDuck)
19  public
20    procedure Quack; override;
21    procedure Fly;   override;
22  end;
23
24implementation
25
26{ TMallarDuck }
27
28procedure TMallarDuck.Fly;
29begin
30  Writeln('I''m flying.');
31end;
32
33procedure TMallarDuck.Quack;
34begin
35  Writeln('Quack.');
36end;
37
38end.
 1
 2{《HeadFirst设计模式》之适配器模式 }
 3{ 适配器,转换现有类的接口         }
 4{ 编译工具:Delphi7.0            }
 5{ E-Mail :guzh-0417@163.com    }
 6
 7unit uAdapter;
 8
 9interface
10
11uses
12  uTarget, uAdaptee;
13
14type
15  TTurkeyAdapter = class(TDuck)
16  private
17    FTurkey: TTurkey;
18  public
19    constructor Create(aTurkey: TTurkey);
20    procedure Quack; override;
21    procedure Fly;   override;
22  end;
23
24implementation
25
26{ TTurkeyAdapter }
27
28constructor TTurkeyAdapter.Create(aTurkey: TTurkey);
29begin
30  FTurkey := aTurkey;
31end;
32
33procedure TTurkeyAdapter.Fly;
34var
35  i: Integer;
36begin
37  for i := 0 to 4 do
38  begin
39    FTurkey.Fly;
40  end;
41end;
42
43procedure TTurkeyAdapter.Quack;
44begin
45  FTurkey.Gobble;
46end;
47
48end.
 1
 2{《HeadFirst设计模式》之适配器模式 }
 3{ 客户端                         }
 4{ 编译工具:Delphi7.0             }
 5{ E-Mail :guzh-0417@163.com     }
 6
 7program pDuckTestDrive;
 8
 9{$APPTYPE CONSOLE}
10
11uses
12  SysUtils,
13  uAdaptee in 'uAdaptee.pas',
14  uAdapter in 'uAdapter.pas',
15  uTarget in 'uTarget.pas';
16  
17var
18  Duck  : TMallarDuck;
19  Turkey: TWildTurkey;
20  TurkeyAdapter: TTurkeyAdapter;
21
22procedure TestDuck(aDuck: TDuck);
23begin
24  aDuck.Quack;
25  aDuck.Fly;
26end;
27
28begin
29  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;
52end.

运行结果:

Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---适配器模式之TurkeyAdapter[转]的更多相关文章

  1. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---工厂模式之简单工厂

    简单工厂:工厂依据传进的参数创建相应的产品. http://www.cnblogs.com/DelphiDesignPatterns/archive/2009/07/24/1530536.html { ...

  2. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---观察者模式之WeatherReport[转]

      1   2{<HeadFirst设计模式>之观察者模式 }   3{ 主题与观察者                    }   4{ 编译工具 :Delphi7.0          ...

  3. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---模板方法模式之CoffeineBeverageWithHook[转]

    模板方法模式定义了一个算法骨架,允许子类对算法的某个或某些步骤进行重写(override).   1   2{<HeadFirst设计模式>之模板方法模式 }   3{ 编译工具: Del ...

  4. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---迭代器模式之DinerMenu[转]

    容器的主要职责有两个:存放元素和浏览元素.根据单一职责原则(SRP)要将二者分开,于是将浏览功能打包封装就有了迭代器. 用迭代器封装对动态数组的遍历:  1  2{<HeadFirst设计模式& ...

  5. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---策略模式之MiniDuckSimulator[转]

     1  2{<HeadFirst设计模式>之策略模式 }  3{ 本单元中的类为策略类           }  4{ 编译工具: Delphi7.0           }  5{ E- ...

  6. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---装饰模式之StarBuzzCoffee[转]

     1  2{<HeadFirst设计模式>之装饰模式 }  3{ 本单元中的类为被装饰者         }  4{ 编译工具: Delphi7.0          }  5{ E-Ma ...

  7. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---命令模式之RemoteControlTest[转]

      1   2{<HeadFirst设计模式>之命令模式 }   3{ 本单元中的类为命令的接收者      }   4{ 编译工具 :Delphi7.0         }   5{ 联 ...

  8. Delphi 设计模式:《HeadFirst设计模式》Delphi代码---模式小结之一个叫声接口和几只鸭子[转]

    一.一个叫声接口和几只鸭子 从一个叫声接口开始. {<HeadFirst设计模式>Delphi代码之模式小结 } { 一个叫声接口                            } ...

  9. Delphi 设计模式:《HeadFirst设计模式》Delphi代码---工厂模式之抽象工厂[转]

     1  2 {<HeadFirst设计模式>工厂模式之抽象工厂 }  3 { 抽象工厂的产品                       }  4 { 编译工具:Delphi7.0     ...

随机推荐

  1. 【JZOJ3301】家族

    description 阿狸和桃子养了n 个小阿狸, 小阿狸们每天都在一起玩的很开心. 作为工程师的阿狸在对小阿狸们之间的关系进行研究以后发现了小阿狸的人际关系由某种神奇的相互作用决定, 阿狸称之为& ...

  2. JavaScript设置body高度为浏览器高度的方法

    document.getElementsByTagName('body')[0].style.height = window.innerHeight+'px';

  3. 赛后总结——codeforces round 551 div2

    传送门:QAQQAQ 好歹这次比赛打进前1000了...但第一题WA掉也是醉了... 每次比赛刚开始都是太心急,第一题写的特别快,不经过任何检查,结果最近两次比赛都死在了A题上... A题一上来把n, ...

  4. Node中js获取异步操作的结果

    js中要获取异步操作的结果必须使用回调函数 回调函数也被称为高阶函数,简单来说就是,函数作为一个参数传到另一个主函数里面,当那一个主函数执行完之后,再执行传进去的作为参数的函数 function fn ...

  5. Activiti 变量设置

    使用工作流的时候必定会附上一些变量.例如,请假的时候有填写请假理由,天数等等.可以用以下代码实现 public void setVariables(){ /**与任务(正在执行)*/ TaskServ ...

  6. 嘴巴题4 「BZOJ1827」[Usaco2010 Mar] gather 奶牛大集会

    1827: [Usaco2010 Mar]gather 奶牛大集会 Description Bessie正在计划一年一度的奶牛大集会,来自全国各地的奶牛将来参加这一次集会.当然,她会选择最方便的地点来 ...

  7. pg_hba.conf配置文件

    实例级别的权限由pg_hba.conf来控制,例如 : # TYPE DATABASE USER ADDRESS METHOD # "local" is for Unix doma ...

  8. BZOJ 3236 AHOI 2013 作业 莫队+树状数组

    BZOJ 3236 AHOI 2013 作业 内存限制:512 MiB 时间限制:10000 ms 标准输入输出     题目类型:传统 评测方式:文本比较 题目大意: 此时己是凌晨两点,刚刚做了Co ...

  9. DBMS的四大特性

  10. const 有什么用途

    可以定义const 常量:const可以修饰函数的参数.返回值,甚至函数的定义体.被const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性