Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---策略模式之MiniDuckSimulator[转]
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[转]的更多相关文章
- Java设计模式(十二) 策略模式
原创文章,同步发自作者个人博客,http://www.jasongj.com/design_pattern/strategy/ 策略模式介绍 策略模式定义 策略模式(Strategy Pattern) ...
- 设计模式之第8章-策略模式(Java实现)
设计模式之第8章-策略模式(Java实现) “年前大酬宾了啊,现在理发冲500送300,冲1000送500了.鱼哥赶紧充钱啊,理发这事基本一个月一回,挺实惠的啊.不过话说那个理发店的老板好傻啊,冲10 ...
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---工厂模式之简单工厂
简单工厂:工厂依据传进的参数创建相应的产品. http://www.cnblogs.com/DelphiDesignPatterns/archive/2009/07/24/1530536.html { ...
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---模板方法模式之CoffeineBeverageWithHook[转]
模板方法模式定义了一个算法骨架,允许子类对算法的某个或某些步骤进行重写(override). 1 2{<HeadFirst设计模式>之模板方法模式 } 3{ 编译工具: Del ...
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---迭代器模式之DinerMenu[转]
容器的主要职责有两个:存放元素和浏览元素.根据单一职责原则(SRP)要将二者分开,于是将浏览功能打包封装就有了迭代器. 用迭代器封装对动态数组的遍历: 1 2{<HeadFirst设计模式& ...
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---命令模式之RemoteControlTest[转]
1 2{<HeadFirst设计模式>之命令模式 } 3{ 本单元中的类为命令的接收者 } 4{ 编译工具 :Delphi7.0 } 5{ 联 ...
- 我所理解的设计模式(C++实现)——策略模式(Strategy Pattern)
概述: 每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法. 而策略模式就是对算法进行包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理.策 ...
- Python 中的设计模式详解之:策略模式
虽然设计模式与语言无关,但这并不意味着每一个模式都能在每一门语言中使用.<设计模式:可复用面向对象软件的基础>一书中有 23 个模式,其中有 16 个在动态语言中“不见了,或者简化了”. ...
- 《JavaScript设计模式与开发实践》-- 策略模式
详情个人博客:https://shengchangwei.github.io/js-shejimoshi-celue/ 策略模式 1.定义 策略模式:定义一系列的算法,把它们一个个封装起来,并且使它们 ...
随机推荐
- 在vue项目中使用Nprogress.js进度条
NProgress是一款在网页顶部添加细长进度条的工具,非常轻巧,使用起来也非常便捷,灵感来源于Google, YouTube. 1.安装 $ npm install --save nprogress ...
- [JZOJ1320] 【Usaco2009 gold 】拯救奶牛
题目 题目大意 一个三角形的网格图,三角形与其有共同边的三角形相连. 起点到所有终点的最短距离. 思考历程 数据看起来还挺大的,所以不是什么图论算法. 这显然是一个结论题. 什么结论? 然后我就开始推 ...
- RMQ问题——ST算法
比赛当中,常会出现RMQ问题,即求区间最大(小)值.我们该怎样解决呢? 主要方法有线段树.ST.树状数组.splay. 例题 题目描述 2008年9月25日21点10分,酒泉卫星发射中心指控大厅里,随 ...
- 2016.10.6初中部上午NOIP普及组比赛总结
2016.10.6初中部上午NOIP普及组比赛总结 中了病毒--病毒--病毒-- 进度: 比赛:AC+0+0+20=120 改题:AC+0+AC+20=220 Stairs 好--简--单!递推就过了 ...
- 廖雪峰Java14Java操作XML和JSON-1XML-2DOM
XML是一种数据表示形式. 可以描述非常复杂的数据数据结构 用于传输和传输数据 DOM:Document Object Model DOM模型就是把XML文档作为一个树形结构,从根结点开始,每个节点都 ...
- ThinkPHP 数据更新
ThinkPHP的数据更新操作包括更新数据和更新字段方法. 直线电机厂家 更新数据 更新数据使用save方法,例如: $User = M("User"); // 实例化User对象 ...
- centos6 nginx安装好以后,添加拓展ssl
前言 安装nginx的时候,只是执行最简单的安装,--user=nobody --group=nobody --prefix=/usr/local/nginx_1.8.1,没有安装http_ssl_m ...
- C#多线程实现方法——线程池(Thread Pool)
ThreadPool使用 同步机制 ThreadPool使用 需要定义waitcallback委托形式如 public delegate void WaitCallback(object stat ...
- 【JEECG-Boot 技术文档】新手入门教程
Jeecg-Boot入门教程必看(新手学习) 1.开发环境搭建 http://jeecg-boot.mydoc.io/?t=345670 开发工具 :https://pan.baidu.com/sha ...
- PAT甲级——A1089 Insert or Merge
According to Wikipedia: Insertion sort iterates, consuming one input element each repetition, and gr ...