zoukankan      html  css  js  c++  java
  • Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---门面模式之HomeTheater[转]


      1unit uSubObject;
      2
      3interface
      4
      5type
      6
      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  private
     19    FTuner: TTuner;
     20    FCD : TCDPlayer;
     21    FDVD: TDVDPlayer;
     22    FDescription: String;
     23  public
     24    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  private
     38    FAmplifier: TAmplifier;
     39    FDescription: String;
     40    FFrequency: Double;
     41  public
     42    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  private
     53    FAmplifier: TAmplifier;
     54    FDescription: String;
     55    FCurrentTrack: Integer;
     56    FTitle: String;
     57  public
     58    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  private
     71    FAmplifier: TAmplifier;
     72    FDescription: String;
     73    FCurrentTrack: Integer;
     74    FMovie: String;
     75  public
     76    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  private
     91    FDescription: String;
     92  public
     93    constructor Create(aDescription: String);
     94    procedure UP;
     95    procedure Down;
     96    function ToString: String;
     97  end;
     98
     99  TPopcornPopper = class(TObject)
    100  private
    101    FDescription: String;
    102  public
    103    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  private
    112    FDescription: String;
    113  public
    114    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  private
    123    FDescription: String;
    124    FDVD: TDVDPlayer;
    125  public
    126    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
    134implementation
    135
    136{ TAmplifier }
    137
    138constructor TAmplifier.Create(aDescription: String);
    139begin
    140  FDescription := aDescription;
    141end;
    142
    143procedure TAmplifier.Off;
    144begin
    145  Writeln(FDescription + ' off');
    146end;
    147
    148procedure TAmplifier.Open;
    149begin
    150  Writeln(FDescription + ' on');
    151end;
    152
    153procedure TAmplifier.SetCD(aCD: TCDPlayer);
    154begin
    155  Writeln(FDescription + ' setting CD player to ' + aCD.ToString);
    156  FCD := aCD;
    157end;
    158
    159procedure TAmplifier.SetDVD(aDVD: TDVDPlayer);
    160begin
    161  Writeln(FDescription + ' setting DVD player to ' + aDVD.ToString);
    162  FDVD := aDVD;
    163end;
    164
    165procedure TAmplifier.SetStereoSound;
    166begin
    167  Writeln(FDescription + ' stereo mode on');
    168end;
    169
    170procedure TAmplifier.SetSurroundSound;
    171begin
    172  Writeln(FDescription + ' surround sound on (5 speakers, 1 subwoofer)');
    173end;
    174
    175procedure TAmplifier.SetTuner(aTuner: TTuner);
    176begin
    177  Writeln(FDescription + ' setting Tuner player to ', aTuner.ToString);
    178  FTuner := aTuner;
    179end;
    180
    181procedure TAmplifier.SetVolume(aLevel: Integer);
    182begin
    183  Writeln(FDescription +  ' setting volume to ' , aLevel);
    184end;
    185
    186function TAmplifier.ToString: String;
    187begin
    188  Result := FDescription;
    189end;
    190
    191{ TTuner }
    192
    193constructor TTuner.Create(aDescription: String; aAmplifier: TAmplifier);
    194begin
    195  FDescription := aDescription;
    196  FAmplifier   := aAmplifier;
    197end;
    198
    199procedure TTuner.Off;
    200begin
    201  Writeln(FDescription + ' off');
    202end;
    203
    204procedure TTuner.Open;
    205begin
    206  Writeln(FDescription + ' on');
    207end;
    208
    209procedure TTuner.SetAm;
    210begin
    211  Writeln(FDescription + ' setting AM mode');
    212end;
    213
    214procedure TTuner.SetFm;
    215begin
    216  Writeln(FDescription + ' setting FM mode');
    217end;
    218
    219procedure TTuner.SetFrequency(aFrequency: Double);
    220begin
    221  Writeln(FDescription + ' setting frequency to ', aFrequency);
    222  FFrequency := aFrequency;
    223end;
    224
    225function TTuner.ToString: String;
    226begin
    227  Result := FDescription;
    228end;
    229
    230{ TCDPlayer }
    231
    232constructor TCDPlayer.Create(aDescription: String; aAmplifier: TAmplifier);
    233begin
    234  FDescription := aDescription;
    235  FAmplifier   := aAmplifier;
    236end;
    237
    238procedure TCDPlayer.Eject;
    239begin
    240  FTitle := '';
    241  Writeln(FDescription + ' eject');
    242end;
    243
    244procedure TCDPlayer.Off;
    245begin
    246  Writeln(FDescription + ' off');
    247end;
    248
    249procedure TCDPlayer.Open;
    250begin
    251  Writeln(FDescription + ' on');
    252end;
    253
    254procedure TCDPlayer.Pause;
    255begin
    256  Writeln(FDescription + ' paused <' + FTitle + '>');
    257end;
    258
    259procedure TCDPlayer.Play(aTitle: String);
    260begin
    261  FTitle := aTitle;
    262  FCurrentTrack := 0;
    263  Writeln(FDescription + ' playing <' + FTitle + '>');
    264end;
    265
    266procedure TCDPlayer.Play(aTrack: Integer);
    267begin
    268  if FTitle = '' then
    269    begin
    270      Writeln(FDescription + ' can'' t play track ', aTrack, ', no CD inserted');
    271    end
    272  else
    273    begin
    274      FCurrentTrack := aTrack;
    275      Writeln(FDescription + ' playing track ', FCurrentTrack);
    276    end;
    277end;
    278
    279procedure TCDPlayer.Stop;
    280begin
    281  FCurrentTrack := 0;
    282  Writeln(FDescription + ' stopped');
    283end;
    284
    285function TCDPlayer.ToString: String;
    286begin
    287  Result := FDescription;
    288end;
    289
    290{ TDVDPlayer }
    291
    292constructor TDVDPlayer.Create(aDescription: String; aAmplifier: TAmplifier);
    293begin
    294  FDescription := aDescription;
    295  FAmplifier   := aAmplifier;
    296end;
    297
    298procedure TDVDPlayer.Eject;
    299begin
    300  Writeln(FDescription + ' eject');
    301end;
    302
    303procedure TDVDPlayer.Off;
    304begin
    305  Writeln(FDescription + ' off');
    306end;
    307
    308procedure TDVDPlayer.Open;
    309begin
    310  Writeln(FDescription + ' on');
    311end;
    312
    313procedure TDVDPlayer.Pause;
    314begin
    315  Writeln(FDescription + ' paused <' + FMovie + '>');
    316end;
    317
    318procedure TDVDPlayer.Play(aTrack: Integer);
    319begin
    320  if FMovie = '' then
    321    begin
    322      Writeln(FDescription + ' can'' t play track ', aTrack, ', no DVD inserted');
    323    end
    324  else
    325    begin
    326      FCurrentTrack := aTrack;
    327      Writeln(FDescription + ' playing track ', FCurrentTrack, ' of <', FMovie, '>');
    328    end;
    329end;
    330
    331procedure TDVDPlayer.Play(aMovie: String);
    332begin
    333  FMovie := aMovie;
    334  FCurrentTrack := 0;
    335  Writeln(FDescription + ' playing <' + FMovie + '>');
    336end;
    337
    338procedure TDVDPlayer.SetSurroundAudio;
    339begin
    340  Writeln(FDescription + ' set surround audio');
    341end;
    342
    343procedure TDVDPlayer.SetTwoChannelAudio;
    344begin
    345  Writeln(FDescription + ' set two channel audio');
    346end;
    347
    348procedure TDVDPlayer.Stop;
    349begin
    350  FCurrentTrack := 0;
    351  Writeln(FDescription + ' <' + FMovie + '> stopped');
    352end;
    353
    354function TDVDPlayer.ToString: String;
    355begin
    356  Result := FDescription;
    357end;
    358
    359{ TScreen }
    360
    361constructor TScreen.Create(aDescription: String);
    362begin
    363  FDescription := aDescription;
    364end;
    365
    366procedure TScreen.Down;
    367begin
    368  Writeln(FDescription, ' going down');
    369end;
    370
    371function TScreen.ToString: String;
    372begin
    373  Result := FDescription;
    374end;
    375
    376procedure TScreen.UP;
    377begin
    378  Writeln(FDescription, ' going up');
    379end;
    380
    381{ TPopcornPopper }
    382
    383constructor TPopcornPopper.Create(aDescription: String);
    384begin
    385  FDescription := aDescription;
    386end;
    387
    388procedure TPopcornPopper.Off;
    389begin
    390  Writeln(FDescription, ' off');
    391end;
    392
    393procedure TPopcornPopper.Open;
    394begin
    395  Writeln(FDescription, ' on');
    396end;
    397
    398procedure TPopcornPopper.Pop;
    399begin
    400  Writeln(FDescription, ' popping popcorn!');
    401end;
    402
    403function TPopcornPopper.ToString: String;
    404begin
    405  Result := FDescription;
    406end;
    407
    408{ TTheaterLights }
    409
    410constructor TTheaterLights.Create(aDescription: String);
    411begin
    412  FDescription := aDescription;
    413end;
    414
    415procedure TTheaterLights.Dim(aLevel: Integer);
    416begin
    417  Writeln(FDescription, ' dimming to ', aLevel, '%');
    418end;
    419
    420procedure TTheaterLights.Off;
    421begin
    422  Writeln(FDescription, ' off');
    423end;
    424
    425procedure TTheaterLights.Open;
    426begin
    427  Writeln(FDescription, ' on');
    428end;
    429
    430function TTheaterLights.ToString: String;
    431begin
    432  Result := FDescription;
    433end;
    434
    435{ TProjector }
    436
    437constructor TProjector.Create(aDescription: String; aDVD: TDVDPlayer);
    438begin
    439  FDescription := aDescription;
    440  FDVD := aDVD;
    441end;
    442
    443procedure TProjector.Off;
    444begin
    445  Writeln(FDescription, ' off');
    446end;
    447
    448procedure TProjector.Open;
    449begin
    450  Writeln(FDescription, ' on');
    451end;
    452
    453function TProjector.ToString: String;
    454begin
    455  Result := FDescription;
    456end;
    457
    458procedure TProjector.TVMode;
    459begin
    460  Writeln(FDescription + ' in tv mode (4x3 aspect ratio)');
    461end;
    462
    463procedure TProjector.WideScreenMode;
    464begin
    465  Writeln(FDescription + ' in widescreen mode (16x9 aspect ratio)');
    466end;
    467
    468end.

      1unit uFacadeObject;
      2
      3interface
      4
      5uses
      6  uSubObject;
      7
      8type
      9  THomeTheaterFacade = class(TObject)
     10  private
     11    FAmp: TAmplifier;
     12    FTuner: TTuner;
     13    FDVD: TDVDPlayer;
     14    FCD: TCDPlayer;
     15    FProjector: TProjector;
     16    FLights: TTheaterLights;
     17    FScreen: TScreen;
     18    FPopper: TPopcornPopper;
     19  public
     20    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
     36implementation
     37
     38{ THomeTheaterFacade }
     39
     40constructor 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);
     48begin
     49  FAmp    := aAmp;
     50  FTuner  := aTuner;
     51  FDVD    := aDVD;
     52  FCD     := aCD;
     53  FProjector := aProjector;
     54  FLights := aLights;
     55  FScreen := aScreen;
     56  FPopper := aPopper;
     57end;
     58
     59procedure THomeTheaterFacade.EndCD;
     60begin
     61  Writeln('Shutting down CD');
     62  FAmp.Off;
     63  FAmp.SetCD(FCD);
     64  FCD.Eject;
     65  FCD.Off;
     66end;
     67
     68procedure THomeTheaterFacade.EndMovie;
     69begin
     70  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;
     79end;
     80
     81procedure THomeTheaterFacade.EndRadio;
     82begin
     83  Writeln('Shutting down the tuner');
     84  FTuner.Off;
     85  FAmp.Off;
     86end;
     87
     88procedure THomeTheaterFacade.ListenToCD(CDTitle: String);
     89begin
     90  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);
     98end;
     99
    100procedure THomeTheaterFacade.ListenToRadio(aFrequency: Double);
    101begin
    102  Writeln('Tuning in the airwaves');
    103  FTuner.Open;
    104  FTuner.SetFrequency(aFrequency);
    105  FAmp.Open;
    106  FAmp.SetVolume(5);
    107  FAmp.SetTuner(FTuner);
    108end;
    109
    110procedure THomeTheaterFacade.WatchMovie(aMovie: String);
    111begin
    112  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);
    125end;
    126
    127end.

     1program pHomeTheaterTestDrive;
     2
     3{$APPTYPE CONSOLE}
     4
     5uses
     6  SysUtils,
     7  uFacadeObject in 'uFacadeObject.pas',
     8  uSubObject in 'uSubObject.pas';
     9
    10var
    11  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   
    22begin
    23  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;
    50end.

    运行结果:

     
     
  • 相关阅读:
    webServer xampp的安装及使用
    javascript 原生方法监听DOM结构改变事件
    c# 文件简繁体转换
    c# 网络是否连接
    JMS
    JMS
    JMS
    Quartz Scheduler(2.2.1)
    MySQL
    Git CMD
  • 原文地址:https://www.cnblogs.com/0x2D-0x22/p/4076270.html
Copyright © 2011-2022 走看看