1
 2{《HeadFirst设计模式》之策略模式 }
 3{ 本单元中的类为策略类           }
 4{ 编译工具: Delphi7.0           }
 5{ E-Mail : guzh-0417@163.com   }
 6
 7unit uStrategy;
 8
 9interface
10
11type
12  {飞行接口,及其实现类 }
13
14  IFlyBehavior = Interface(IInterface)
15    procedure Fly;
16  end;
17
18  TFlyWithWings = class(TInterfacedObject, IFlyBehavior)
19  public
20    procedure Fly;
21  end;
22
23  TFlyNoWay = class(TInterfacedObject, IFlyBehavior)
24  public
25    procedure Fly;
26  end;
27
28  TFlyRocketPowered = class(TInterfacedObject, IFlyBehavior)
29  public
30    procedure Fly;
31  end;
32
33  {叫声接口,及其实现类}
34
35  IQuackBehavior = Interface(IInterface)
36    procedure Quack;
37  end;
38
39  TQuack = class(TInterfacedObject, IQuackBehavior)
40  public
41    procedure Quack;
42  end;
43
44  TMuteQuack = class(TInterfacedObject, IQuackBehavior)
45  public
46    procedure Quack;
47  end;
48
49  TSqueak = class(TInterfacedObject, IQuackBehavior)
50  public
51    procedure Quack;
52  end;
53
54implementation
55
56{ TFlyWithWings }
57
58procedure TFlyWithWings.Fly;
59begin
60  Writeln('I am flying!');
61end;
62
63{ TFlyNoWay }
64
65procedure TFlyNoWay.Fly;
66begin
67  Writeln('I can not fly!');
68end;
69
70{ TFlyRocketPowered }
71
72procedure TFlyRocketPowered.Fly;
73begin
74  Writeln('I am flying with a rocket!');
75end;
76
77{ TQuack }
78
79procedure TQuack.Quack;
80begin
81  Writeln('Quack');
82end;
83
84{ TMuteQuack }
85
86procedure TMuteQuack.Quack;
87begin
88  Writeln('<Silence>');
89end;
90
91{ TSqueak }
92
93procedure TSqueak.Quack;
94begin
95  Writeln('Squeak');
96end;
97
98end.
  1
  2{《HeadFirst设计模式》之策略模式           }
  3{ 本单元中的类为策略的用户,                }
  4{ 一般策略模式中的上下文接口已包含在用户类中。}
  5{ 编译工具: Delphi7.0                     }
  6{ E-Mail : guzh-0417@163.com             }
  7
  8unit uDuck;
  9
 10interface
 11
 12uses
 13  uStrategy;
 14
 15type
 16  { 鸭子抽象类 }
 17
 18  TDuck = class(TObject)
 19  protected
 20    FFlyBehavior  : IFlyBehavior;
 21    FQuackBehavior: IQuackBehavior;
 22  public
 23    procedure Display; virtual; abstract;
 24    procedure PerformFly;
 25    procedure PerformQuack;
 26    procedure Swim;
 27    procedure SetFlyBehavior(FlyBehavior: IFlyBehavior);
 28    procedure SetQuackBehavior(QuackBehavior: IQuackBehavior);
 29  end;
 30
 31  { 绿头鸭具体类 }
 32
 33  TMallardDuck = class(TDuck)
 34  public
 35    constructor Create;
 36    destructor Destroy; override;
 37    procedure Display; override;
 38  end;
 39
 40  { 模型鸭具体类 }
 41  
 42  TModelDuck = class(TDuck)
 43  public
 44    constructor Create;
 45    destructor Destroy; override;
 46    procedure Display; override;
 47  end;
 48
 49implementation
 50
 51{ TDuck }
 52
 53procedure TDuck.PerformFly;
 54begin
 55  FFlyBehavior.Fly;
 56end;
 57
 58procedure TDuck.PerformQuack;
 59begin
 60  FQuackBehavior.Quack;
 61end;
 62
 63procedure TDuck.SetFlyBehavior(FlyBehavior: IFlyBehavior);
 64begin
 65  FFlyBehavior := FlyBehavior;
 66end;
 67
 68procedure TDuck.SetQuackBehavior(QuackBehavior: IQuackBehavior);
 69begin
 70  FQuackBehavior := QuackBehavior;
 71end;
 72
 73procedure TDuck.Swim;
 74begin
 75  Writeln('All ducks float, even decoys!');
 76end;
 77
 78{ TMallardDuck }
 79
 80constructor TMallardDuck.Create;
 81begin
 82  FQuackBehavior := TQuack.Create;
 83  FFlyBehavior   := TFlyWithWings.Create;
 84end;
 85
 86destructor TMallardDuck.Destroy;
 87begin
 88  FQuackBehavior := nil;
 89  FFlyBehavior   := nil;
 90  inherited;
 91end;
 92
 93procedure TMallardDuck.Display;
 94begin
 95  Writeln('I am a real mallard duck');
 96end;
 97
 98{ TModelDuck }
 99
100constructor TModelDuck.Create;
101begin
102  FFlyBehavior   := TFlyNoWay.Create;
103  FQuackBehavior := TQuack.Create;
104end;
105
106destructor TModelDuck.Destroy;
107begin
108  FQuackBehavior := nil;
109  FFlyBehavior   := nil;
110  inherited;
111end;
112
113procedure TModelDuck.Display;
114begin
115  Writeln('I am a model duck');
116end;
117
118end.
119 
 1
 2{《HeadFirst设计模式》之策略模式 }
 3{ 客户端                       }
 4{ 编译工具: Delphi7.0          }
 5{ E-Mail : guzh-0417@163.com  }
 6
 7program pMiniDuckSimulator;
 8
 9{$APPTYPE CONSOLE}
10
11uses
12  SysUtils,
13  uDuck in 'uDuck.pas',
14  uStrategy in 'uStrategy.pas';
15
16var
17  Mallard: TDuck;
18  Model  : TDuck;
19  FlyRocketPowered: IFlyBehavior;
20  
21begin
22  Mallard := TMallardDuck.Create;
23  Mallard.PerformQuack;
24  Mallard.PerformFly;
25  FreeAndNil(Mallard);
26
27  Model := TModelDuck.Create;
28  Model.PerformFly;
29
30  FlyRocketPowered := TFlyRocketPowered.Create;
31  Model.SetFlyBehavior(FlyRocketPowered);
32  Model.PerformFly;
33  FlyRocketPowered := nil;
34  FreeAndNil(Model);
35
36  Readln;
37end.

运行结果:

 
 

Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---策略模式之MiniDuckSimulator[转]的更多相关文章

  1. Java设计模式(十二) 策略模式

    原创文章,同步发自作者个人博客,http://www.jasongj.com/design_pattern/strategy/ 策略模式介绍 策略模式定义 策略模式(Strategy Pattern) ...

  2. 设计模式之第8章-策略模式(Java实现)

    设计模式之第8章-策略模式(Java实现) “年前大酬宾了啊,现在理发冲500送300,冲1000送500了.鱼哥赶紧充钱啊,理发这事基本一个月一回,挺实惠的啊.不过话说那个理发店的老板好傻啊,冲10 ...

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

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

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

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

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

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

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

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

  7. 我所理解的设计模式(C++实现)——策略模式(Strategy Pattern)

    概述: 每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法. 而策略模式就是对算法进行包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理.策 ...

  8. Python 中的设计模式详解之:策略模式

    虽然设计模式与语言无关,但这并不意味着每一个模式都能在每一门语言中使用.<设计模式:可复用面向对象软件的基础>一书中有 23 个模式,其中有 16 个在动态语言中“不见了,或者简化了”. ...

  9. 《JavaScript设计模式与开发实践》-- 策略模式

    详情个人博客:https://shengchangwei.github.io/js-shejimoshi-celue/ 策略模式 1.定义 策略模式:定义一系列的算法,把它们一个个封装起来,并且使它们 ...

随机推荐

  1. css3 html5 手机设备 列表的弹回和加速移动

    <style type="text/css"> * { margin: 0; padding: 0; } .min { width: 350px; height: 40 ...

  2. Django之ORM查询优化

    目录 only 和 defer select_related 和 prefetch_related ORM字段参数 choices res = models.Book.objects.all() # ...

  3. System.Web.Mvc.ContentResult.cs

    ylbtech-System.Web.Mvc.ContentResult.cs 1.程序集 System.Web.Mvc, Version=5.2.3.0, Culture=neutral, Publ ...

  4. Python import用法以及与from...import的区别

    Python import用法以及与from...import的区别 在python用import或者from...import来导入相应的模块.模块其实就是一些函数和类的集合文件,它能实现一些相应的 ...

  5. #、%和$符号在OGNL表达式中的作用

    #.%和$符号在OGNL表达式中经常出现,而这三种符号也是开发者不容易掌握和理解的部分.在这里笔者简单介绍它们的相应用途. 1.#符号的用途一般有三种.   1)访问非根对象属性,例如示例中的#ses ...

  6. day 42 01--CSS的引入方式及CSS选择器

    01--CSS的引入方式及CSS选择器   本节目录 一 CSS介绍 二 行内样式 三 内接样式 四 外接样式 五 CSS的选择器 六 CSS的高级选择器 七 CSS的属性选择器 八 CSS的伪类选择 ...

  7. java基础之Character类概述

    Character 类 在对象中包装一个基本类型 char 的值 此外,该类提供了几种方法,以确定字符的类别(小写字母,数字,等等),并将字符从大写转换成小写,反之亦然 构造方法 public Cha ...

  8. 2019-8-26-当-ASP.NET-Core-链接找不到时可能的原因

    title author date CreateTime categories 当 ASP.NET Core 链接找不到时可能的原因 lindexi 2019-08-26 18:52:28 +0800 ...

  9. iTerm2配色和去掉profile提示框

    效果: 配色方案代码地址: https://github.com/mbadolato/iTerm2-Color-Schemes 点击最右边的绿色区域,再点击  “import”, 打开刚下载解压好的文 ...

  10. linux拆分文件

    1.先看下文件总的行数: wc -l filename 我们现在来看看它具体的参数该怎么用: split支持自定义输出文件大小和输出文件行数两种模式,此外还可以定义每一行最大的值. -l 按输出文件行 ...