一、一个叫声接口和几只鸭子

  1. 从一个叫声接口开始。
  2. {《HeadFirst设计模式》Delphi代码之模式小结 }
  3. { 一个叫声接口                            }
  4. { 编译工具:Delphi2010 for win32          }
  5. { E-Mail :guzh-0417@163.com             }
  6. unit uQuackable;
  7. interface
  8. type
  9. IQuackable = interface(IInterface)
  10. procedure Quack;
  11. end;
  12. implementation
  13. end.

2、几只鸭子实现了该叫声接口。

 1
 2{《HeadFirst设计模式》Delphi代码之模式小结 }
 3{ 几只鸭子实现了声接口                    }
 4{ 编译工具:Delphi2010 for win32         }
 5{ E-Mail :guzh-0417@163.com            }
 6
 7unit uDuck;
 8
 9interface
10
11uses
12  uQuackable;
13
14type
15  TMallardDuck = class(TInterfacedObject, IQuackable)
16  public
17    procedure Quack;
18  end;
19
20  TRedHeadDuck = class(TInterfacedObject, IQuackable)
21  public
22    procedure Quack;
23  end;
24
25  TDuckCall = class(TInterfacedObject, IQuackable)
26  public
27    procedure Quack;
28  end;
29
30  TRubberDuck = class(TInterfacedObject, IQuackable)
31  public
32    procedure Quack;
33  end;
34
35implementation
36
37{ TMallardDuck }
38
39procedure TMallardDuck.Quack;
40begin
41  Writeln('Quack');
42end;
43
44{ TRedHeadDuck }
45
46procedure TRedHeadDuck.Quack;
47begin
48  Writeln('Quack');
49end;
50
51{ TDuckCall }
52
53procedure TDuckCall.Quack;
54begin
55  Writeln('Kwak');
56end;
57
58{ TRubberDuck }
59
60procedure TRubberDuck.Quack;
61begin
62  Writeln('Squeak');
63end;
64
65end.

3、叫声接口为鸭鸣器提供服务。叫声接口与鸭鸣器的关系比与它的实现类更密切。

 1
 2{《HeadFirst设计模式》Delphi代码之模式小结 }
 3{ 鸭鸣模拟器                             }
 4{ 编译工具:Delphi2010 for win32         }
 5{ E-Mail :guzh-0417@163.com            }
 6
 7unit uDuckSimulator;
 8
 9interface
10
11uses
12  uQuackable, uDuck;
13
14type
15  TDuckSimulator = class(TObject)
16  private
17    procedure Simulate(aDuck: IQuackable); overload;
18  public
19    procedure Simulate; overload;
20  end;
21
22implementation
23
24{ TDuckSimulator }
25
26procedure TDuckSimulator.Simulate(aDuck: IQuackable); { 此处交给多态处理 }
27begin
28  aDuck.Quack;
29end;
30
31procedure TDuckSimulator.Simulate;
32var
33  aMallardDuck: IQuackable;
34  aRedHeadDuck: IQuackable;
35  aDuckCall   : IQuackable;
36  aRubberDuck : IQuackable;
37begin
38  try
39    { 创建鸭鸣实例 }
40    aMallardDuck := TMallardDuck.Create;
41    aRedHeadDuck := TRedHeadDuck.Create;
42    aDuckCall    := TDuckCall.Create;
43    aRubberDuck  := TRubberDuck.Create;
44
45    Writeln('Duck Simulator');
46
47    { 模拟鸭鸣 }
48    Simulate(aMallardDuck);
49    Simulate(aRedHeadDuck);
50    Simulate(aDuckCall);
51    Simulate(aRubberDuck );
52  finally
53    aMallardDuck := nil;
54    aRedHeadDuck := nil;
55    aDuckCall    := nil;
56    aRubberDuck  := nil;
57  end;
58end;
59
60end.

4、客户端。

 1
 2{《HeadFirst设计模式》Delphi代码之模式小结 }
 3{ 客户端                                   }
 4{ 编译工具:Delphi2010 for win32           }
 5{ E-Mail :guzh-0417@163.com               }
 6
 7program pDuckSimulator;
 8
 9{$APPTYPE CONSOLE}
10
11uses
12  uDuck in 'uDuck.pas',
13  uDuckSimulator in 'uDuckSimulator.pas',
14  uQuackable in 'uQuackable.pas';
15
16var
17  aSimulator: TDuckSimulator;
18
19begin
20  aSimulator := TDuckSimulator.Create;
21
22  aSimulator.Simulate;
23
24  aSimulator.Free;
25
26  Readln;
27end.

5、运行结果:

 
 

Delphi 设计模式:《HeadFirst设计模式》Delphi代码---模式小结之一个叫声接口和几只鸭子[转]的更多相关文章

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

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

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

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

  3. Delphi 设计模式:《HeadFirst设计模式》Delphi2007代码---组合模式之Menus[转]

     1  2{<HeadFirst设计模式>之组合模式 }  3{ 组合与单项的抽象父类           }  4{ 编译工具:Delphi2007 for win32}  5{ E-M ...

  4. Delphi 设计模式:《HeadFirst设计模式》Delphi2007代码---工厂模式之工厂方法[转]

      1   2{<HeadFirst设计模式>工厂模式之工厂方法 }   3{ 产品类                              }   4{ 编译工具 :Delphi20 ...

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

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

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

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

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

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

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

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

  9. Delphi 设计模式:《HeadFirst设计模式》Delphi2007代码---单例模式之ChocolateBoiler[转]

     1  2{<HeadFirst设计模式>之单例模式 }  3{ 编译工具: Delphi2007 for win32 }  4{ E-Mail : guzh-0417@163.com   ...

随机推荐

  1. 分享一些PPT模板

     链接:https://pan.baidu.com/s/1ADlYzx7sWR2z0ltVt8kIAQ 提取码:tyzv  

  2. jquery学习笔记(五):AJAX

    内容来自[汇智网]jquery学习课程 5.1 ajax AJAX 是与服务器交换数据的艺术,它在不重载全部页面的情况下,实现了对部分网页的更新. AJAX = 异步 JavaScript 和 XML ...

  3. gulp是什么?

    什么是gulp? gulp初涉 1.什么是gulp? gulp是前端开发过程中一种基于流的代码构建工具,是自动化项目的构建利器:它不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的 ...

  4. eax,ebx,ecx,edx,esi,edi,ebp,esp寄存器的作用

    位的寄存器.如果用C语言来解释,可以把这些寄存器当作变量看待. 比方说:add eax,-2 ;   //可以认为是给变量eax加上-2这样的一个值. 位寄存器有多种用途,但每一个都有"专长 ...

  5. maven项目依赖其他jar包的时候,idea运行没问题,java -jar 报错:java.lang.SecurityException: Invalid signature file digest

    当项目依赖其他jar包的时候,打出的jar包执行出错,抛出这个异常. 原因:因为依赖jar包中的META-INF中有多余的.SF文件与当前jar包冲突, 解决方案 一 在打包前删除依赖jar包的.SF ...

  6. tomcat JAVA_OPTS设置

    原文地址:https://blog.csdn.net/bamboo_cqh/article/details/72820700 AVA_OPTS ,顾名思义,是用来设置JVM相关运行参数的变量. JVM ...

  7. Pycharm VS VS Code(个人使用感受)

    Pycharm IDE (community enough!) 简单介绍:Pycharn的确是我刚开始学习python时,除了Visual Studio之外,上手的第二个IDE,最初是因其好看的界面, ...

  8. 一个上午,勉强记住了几种不同语言编译PE的启动函数

    VC:启动函数最乱,三大函数都在后面.前面8个PUSH DELPHI7:启动函数最整洁,2.3.4.2,形式排队 VB:启动函数最好记,12个0.... 汇编:三大函数距离最紧凑,除VB外,启动函数最 ...

  9. python csv write 乱码

    参考 : https://www.zhihu.com/question/34201726 1.使用utf_8_sig with open('d:/file.csv', 'w', encoding='u ...

  10. Python-数据类型内置方法(1)

    目录 数字类型内置方法 整形(int) 浮点型(float) 字符串类型内置方法 优先掌握 需要掌握 了解 列表类型内置方法 优先掌握 需要掌握 数字类型内置方法 整形(int) 作用:年龄 定义:x ...