1
unit uSubObject;2

3
interface4

5
type6

7
{ TAmplifier与TTuner,TCDPlayer,TDVDPlayer相互依赖。 }8
{ 在TTuner等的简单实现时用不到对TAmplifier的引用, }9
{ 但现实生活中就应该让TAmplifier提供服务,所以这里保留了。 }10
{ TProjector对TDVDPlayer的引用也是同样道理。 }11
{ 前置TAmplifier也可以,把TAmplifier的声明放在TTuner等声明的后面 }12

13
TTuner = class;14
TCDPlayer = class;15
TDVDPlayer = class;16

17
TAmplifier = class(TObject)18
private19
FTuner: TTuner;20
FCD : TCDPlayer;21
FDVD: TDVDPlayer;22
FDescription: String;23
public24
constructor Create(aDescription: String);25
procedure Open;26
procedure Off;27
procedure SetStereoSound;28
procedure SetSurroundSound;29
procedure SetVolume(aLevel: Integer);30
procedure SetTuner (aTuner: TTuner);31
procedure SetCD (aCD : TCDPlayer);32
procedure SetDVD(aDVD: TDVDPlayer);33
function ToString: String;34
end;35

36
TTuner = class(TObject)37
private38
FAmplifier: TAmplifier;39
FDescription: String;40
FFrequency: Double;41
public42
constructor Create(aDescription: String; aAmplifier: TAmplifier);43
procedure Open;44
procedure Off;45
procedure SetAm;46
procedure SetFm;47
procedure SetFrequency(aFrequency: Double);48
function ToString: String;49
end;50

51
TCDPlayer = class(TObject)52
private53
FAmplifier: TAmplifier;54
FDescription: String;55
FCurrentTrack: Integer;56
FTitle: String;57
public58
constructor Create(aDescription: String; aAmplifier: TAmplifier);59
procedure Open;60
procedure Off;61
procedure Eject;62
procedure Play(aTitle: String ); overload;63
procedure Play(aTrack: Integer); overload;64
procedure Stop;65
procedure Pause;66
function ToString: String;67
end;68

69
TDVDPlayer = class(TObject)70
private71
FAmplifier: TAmplifier;72
FDescription: String;73
FCurrentTrack: Integer;74
FMovie: String;75
public76
constructor Create(aDescription: String; aAmplifier: TAmplifier);77
procedure Open;78
procedure Off;79
procedure Eject;80
procedure Play(aMovie: String ); overload;81
procedure Play(aTrack: Integer); overload;82
procedure Stop;83
procedure Pause;84
procedure SetTwoChannelAudio;85
procedure SetSurroundAudio;86
function ToString: String;87
end;88

89
TScreen = class(TObject)90
private91
FDescription: String;92
public93
constructor Create(aDescription: String);94
procedure UP;95
procedure Down;96
function ToString: String;97
end;98

99
TPopcornPopper = class(TObject)100
private101
FDescription: String;102
public103
constructor Create(aDescription: String);104
procedure Open;105
procedure Off;106
procedure Pop;107
function ToString: String;108
end;109

110
TTheaterLights = class(TObject)111
private112
FDescription: String;113
public114
constructor Create(aDescription: String);115
procedure Open;116
procedure Off;117
procedure Dim(aLevel: Integer);118
function ToString: String;119
end;120

121
TProjector = class(TObject)122
private123
FDescription: String;124
FDVD: TDVDPlayer;125
public126
constructor Create(aDescription: String; aDVD: TDVDPlayer);127
procedure Open;128
procedure Off;129
procedure WideScreenMode;130
procedure TVMode;131
function ToString: String;132
end;133

134
implementation135

136
{ TAmplifier }137

138
constructor TAmplifier.Create(aDescription: String);139
begin140
FDescription := aDescription;141
end;142

143
procedure TAmplifier.Off;144
begin145
Writeln(FDescription + ' off');146
end;147

148
procedure TAmplifier.Open;149
begin150
Writeln(FDescription + ' on');151
end;152

153
procedure TAmplifier.SetCD(aCD: TCDPlayer);154
begin155
Writeln(FDescription + ' setting CD player to ' + aCD.ToString);156
FCD := aCD;157
end;158

159
procedure TAmplifier.SetDVD(aDVD: TDVDPlayer);160
begin161
Writeln(FDescription + ' setting DVD player to ' + aDVD.ToString);162
FDVD := aDVD;163
end;164

165
procedure TAmplifier.SetStereoSound;166
begin167
Writeln(FDescription + ' stereo mode on');168
end;169

170
procedure TAmplifier.SetSurroundSound;171
begin172
Writeln(FDescription + ' surround sound on (5 speakers, 1 subwoofer)');173
end;174

175
procedure TAmplifier.SetTuner(aTuner: TTuner);176
begin177
Writeln(FDescription + ' setting Tuner player to ', aTuner.ToString);178
FTuner := aTuner;179
end;180

181
procedure TAmplifier.SetVolume(aLevel: Integer);182
begin183
Writeln(FDescription + ' setting volume to ' , aLevel);184
end;185

186
function TAmplifier.ToString: String;187
begin188
Result := FDescription;189
end;190

191
{ TTuner }192

193
constructor TTuner.Create(aDescription: String; aAmplifier: TAmplifier);194
begin195
FDescription := aDescription;196
FAmplifier := aAmplifier;197
end;198

199
procedure TTuner.Off;200
begin201
Writeln(FDescription + ' off');202
end;203

204
procedure TTuner.Open;205
begin206
Writeln(FDescription + ' on');207
end;208

209
procedure TTuner.SetAm;210
begin211
Writeln(FDescription + ' setting AM mode');212
end;213

214
procedure TTuner.SetFm;215
begin216
Writeln(FDescription + ' setting FM mode');217
end;218

219
procedure TTuner.SetFrequency(aFrequency: Double);220
begin221
Writeln(FDescription + ' setting frequency to ', aFrequency);222
FFrequency := aFrequency;223
end;224

225
function TTuner.ToString: String;226
begin227
Result := FDescription;228
end;229

230
{ TCDPlayer }231

232
constructor TCDPlayer.Create(aDescription: String; aAmplifier: TAmplifier);233
begin234
FDescription := aDescription;235
FAmplifier := aAmplifier;236
end;237

238
procedure TCDPlayer.Eject;239
begin240
FTitle := '';241
Writeln(FDescription + ' eject');242
end;243

244
procedure TCDPlayer.Off;245
begin246
Writeln(FDescription + ' off');247
end;248

249
procedure TCDPlayer.Open;250
begin251
Writeln(FDescription + ' on');252
end;253

254
procedure TCDPlayer.Pause;255
begin256
Writeln(FDescription + ' paused <' + FTitle + '>');257
end;258

259
procedure TCDPlayer.Play(aTitle: String);260
begin261
FTitle := aTitle;262
FCurrentTrack := 0;263
Writeln(FDescription + ' playing <' + FTitle + '>');264
end;265

266
procedure TCDPlayer.Play(aTrack: Integer);267
begin268
if FTitle = '' then269
begin270
Writeln(FDescription + ' can'' t play track ', aTrack, ', no CD inserted');271
end272
else273
begin274
FCurrentTrack := aTrack;275
Writeln(FDescription + ' playing track ', FCurrentTrack);276
end;277
end;278

279
procedure TCDPlayer.Stop;280
begin281
FCurrentTrack := 0;282
Writeln(FDescription + ' stopped');283
end;284

285
function TCDPlayer.ToString: String;286
begin287
Result := FDescription;288
end;289

290
{ TDVDPlayer }291

292
constructor TDVDPlayer.Create(aDescription: String; aAmplifier: TAmplifier);293
begin294
FDescription := aDescription;295
FAmplifier := aAmplifier;296
end;297

298
procedure TDVDPlayer.Eject;299
begin300
Writeln(FDescription + ' eject');301
end;302

303
procedure TDVDPlayer.Off;304
begin305
Writeln(FDescription + ' off');306
end;307

308
procedure TDVDPlayer.Open;309
begin310
Writeln(FDescription + ' on');311
end;312

313
procedure TDVDPlayer.Pause;314
begin315
Writeln(FDescription + ' paused <' + FMovie + '>');316
end;317

318
procedure TDVDPlayer.Play(aTrack: Integer);319
begin320
if FMovie = '' then321
begin322
Writeln(FDescription + ' can'' t play track ', aTrack, ', no DVD inserted');323
end324
else325
begin326
FCurrentTrack := aTrack;327
Writeln(FDescription + ' playing track ', FCurrentTrack, ' of <', FMovie, '>');328
end;329
end;330

331
procedure TDVDPlayer.Play(aMovie: String);332
begin333
FMovie := aMovie;334
FCurrentTrack := 0;335
Writeln(FDescription + ' playing <' + FMovie + '>');336
end;337

338
procedure TDVDPlayer.SetSurroundAudio;339
begin340
Writeln(FDescription + ' set surround audio');341
end;342

343
procedure TDVDPlayer.SetTwoChannelAudio;344
begin345
Writeln(FDescription + ' set two channel audio');346
end;347

348
procedure TDVDPlayer.Stop;349
begin350
FCurrentTrack := 0;351
Writeln(FDescription + ' <' + FMovie + '> stopped');352
end;353

354
function TDVDPlayer.ToString: String;355
begin356
Result := FDescription;357
end;358

359
{ TScreen }360

361
constructor TScreen.Create(aDescription: String);362
begin363
FDescription := aDescription;364
end;365

366
procedure TScreen.Down;367
begin368
Writeln(FDescription, ' going down');369
end;370

371
function TScreen.ToString: String;372
begin373
Result := FDescription;374
end;375

376
procedure TScreen.UP;377
begin378
Writeln(FDescription, ' going up');379
end;380

381
{ TPopcornPopper }382

383
constructor TPopcornPopper.Create(aDescription: String);384
begin385
FDescription := aDescription;386
end;387

388
procedure TPopcornPopper.Off;389
begin390
Writeln(FDescription, ' off');391
end;392

393
procedure TPopcornPopper.Open;394
begin395
Writeln(FDescription, ' on');396
end;397

398
procedure TPopcornPopper.Pop;399
begin400
Writeln(FDescription, ' popping popcorn!');401
end;402

403
function TPopcornPopper.ToString: String;404
begin405
Result := FDescription;406
end;407

408
{ TTheaterLights }409

410
constructor TTheaterLights.Create(aDescription: String);411
begin412
FDescription := aDescription;413
end;414

415
procedure TTheaterLights.Dim(aLevel: Integer);416
begin417
Writeln(FDescription, ' dimming to ', aLevel, '%');418
end;419

420
procedure TTheaterLights.Off;421
begin422
Writeln(FDescription, ' off');423
end;424

425
procedure TTheaterLights.Open;426
begin427
Writeln(FDescription, ' on');428
end;429

430
function TTheaterLights.ToString: String;431
begin432
Result := FDescription;433
end;434

435
{ TProjector }436

437
constructor TProjector.Create(aDescription: String; aDVD: TDVDPlayer);438
begin439
FDescription := aDescription;440
FDVD := aDVD;441
end;442

443
procedure TProjector.Off;444
begin445
Writeln(FDescription, ' off');446
end;447

448
procedure TProjector.Open;449
begin450
Writeln(FDescription, ' on');451
end;452

453
function TProjector.ToString: String;454
begin455
Result := FDescription;456
end;457

458
procedure TProjector.TVMode;459
begin460
Writeln(FDescription + ' in tv mode (4x3 aspect ratio)');461
end;462

463
procedure TProjector.WideScreenMode;464
begin465
Writeln(FDescription + ' in widescreen mode (16x9 aspect ratio)');466
end;467

468
end.
1
unit uFacadeObject;2

3
interface4

5
uses6
uSubObject;7

8
type9
THomeTheaterFacade = class(TObject)10
private11
FAmp: TAmplifier;12
FTuner: TTuner;13
FDVD: TDVDPlayer;14
FCD: TCDPlayer;15
FProjector: TProjector;16
FLights: TTheaterLights;17
FScreen: TScreen;18
FPopper: TPopcornPopper;19
public20
constructor Create(aAmp : TAmplifier;21
aTuner : TTuner;22
aDVD : TDVDPlayer;23
aCD : TCDPlayer;24
aProjector: TProjector;25
aLights: TTheaterLights;26
aScreen: TScreen;27
aPopper: TPopcornPopper);28
procedure WatchMovie(aMovie: String);29
procedure EndMovie;30
procedure ListenToCD(CDTitle: String);31
procedure EndCD;32
procedure ListenToRadio(aFrequency: Double);33
procedure EndRadio;34
end;35

36
implementation37

38
{ THomeTheaterFacade }39

40
constructor THomeTheaterFacade.Create(aAmp : TAmplifier;41
aTuner : TTuner;42
aDVD : TDVDPlayer;43
aCD : TCDPlayer;44
aProjector: TProjector;45
aLights: TTheaterLights;46
aScreen: TScreen;47
aPopper: TPopcornPopper);48
begin49
FAmp := aAmp;50
FTuner := aTuner;51
FDVD := aDVD;52
FCD := aCD;53
FProjector := aProjector;54
FLights := aLights;55
FScreen := aScreen;56
FPopper := aPopper;57
end;58

59
procedure THomeTheaterFacade.EndCD;60
begin61
Writeln('Shutting down CD
');62
FAmp.Off;63
FAmp.SetCD(FCD);64
FCD.Eject;65
FCD.Off;66
end;67

68
procedure THomeTheaterFacade.EndMovie;69
begin70
Writeln('Shutting movie theater down
');71
FPopper.Off;72
FLights.Open;73
FScreen.UP;74
FProjector.Off;75
FAmp.Off;76
FDVD.Stop;77
FDVD.Eject;78
FDVD.Off;79
end;80

81
procedure THomeTheaterFacade.EndRadio;82
begin83
Writeln('Shutting down the tuner
');84
FTuner.Off;85
FAmp.Off;86
end;87

88
procedure THomeTheaterFacade.ListenToCD(CDTitle: String);89
begin90
Writeln('Get ready for an audiopile experence
');91
FLights.Open;92
FAmp.Open;93
FAmp.SetVolume(5);94
FAmp.SetCD(FCD);95
FAmp.SetStereoSound;96
FCD.Open;97
FCD.Play(CDTitle);98
end;99

100
procedure THomeTheaterFacade.ListenToRadio(aFrequency: Double);101
begin102
Writeln('Tuning in the airwaves
');103
FTuner.Open;104
FTuner.SetFrequency(aFrequency);105
FAmp.Open;106
FAmp.SetVolume(5);107
FAmp.SetTuner(FTuner);108
end;109

110
procedure THomeTheaterFacade.WatchMovie(aMovie: String);111
begin112
Writeln('Get ready to watch a movie
');113
FPopper.Open;114
FPopper.Pop;115
FLights.Dim(10);116
FScreen.Down;117
FProjector.Open;118
FProjector.WideScreenMode;119
FAmp.Open;120
FAmp.SetDVD(FDVD);121
FAmp.SetSurroundSound;122
FAmp.SetVolume(5);123
FDVD.Open;124
FDVD.Play(aMovie);125
end;126

127
end.
1
program pHomeTheaterTestDrive;2

3
{$APPTYPE CONSOLE}4

5
uses6
SysUtils,7
uFacadeObject in 'uFacadeObject.pas',8
uSubObject in 'uSubObject.pas';9

10
var11
Amp : TAmplifier;12
Tuner : TTuner;13
DVD : TDVDPlayer;14
CD : TCDPlayer;15
Projector: TProjector;16
Lights: TTheaterLights;17
Screen: TScreen;18
Popper: TPopcornPopper;19

20
HomeTheater: THomeTheaterFacade;21
22
begin23
Amp := TAmplifier.Create('Top-O-Line Amplifier');24
Tuner := TTuner.Create('Top-O-Line AM/FM Tuner', Amp);25
DVD := TDVDPlayer.Create('Top-O-Line DVD Player', Amp);26
CD := TCDPlayer.Create('Top-O-Line CD Player', Amp);27
Projector := TProjector.Create('Top-O-Line Projector', DVD);28
Lights := TTheaterLights.Create('Theater Ceiling Lights');29
Screen := TScreen.Create('Theater Screen');30
Popper := TPopcornPopper.Create('Popcorn Popper');31

32
HomeTheater := THomeTheaterFacade.Create(Amp, Tuner, DVD, CD, Projector,33
Lights, Screen, Popper);34

35
HomeTheater.WatchMovie('Raiders of the Lost Ark');36
Writeln;37
HomeTheater.EndMovie;38

39
FreeAndNil(Amp);40
FreeAndNil(Tuner);41
FreeAndNil(DVD);42
FreeAndNil(CD);43
FreeAndNil(Projector);44
FreeAndNil(Lights);45
FreeAndNil(Screen);46
FreeAndNil(Popper);47
FreeAndNil(HomeTheater);48

49
Readln;50
end.
运行结果:
浙公网安备 33010602011771号