Skip to content

Commit

Permalink
Initial Commit
Browse files Browse the repository at this point in the history
  • Loading branch information
jimmckeeth committed Dec 31, 2015
1 parent b2ac4c2 commit 6fe750c
Show file tree
Hide file tree
Showing 121 changed files with 9,832 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
program Behavioral.ChainOfResponsibility.Pattern;

{$APPTYPE CONSOLE}

uses
SysUtils,
Pattern in 'Pattern.pas';

var
Director: IApprover;
VicePresident: IApprover;
President: IApprover;
Purchase: TPurchase;

begin
ReportMemoryLeaksOnShutDown := DebugHook <> 0;
try
Director := TDirector.Create;
VicePresident := TVicePresident.Create;
President := TPresident.Create;

try
Director.SetSuccessor(VicePresident);
VicePresident.SetSuccessor(President);

Purchase := TPurchase.Create(2034, 350.00, 'Supplies');
Director.ProcessRequest(Purchase);

Purchase.Free;
Purchase := TPurchase.Create(2035, 32590.10, 'Project X');
Director.ProcessRequest(Purchase);

Purchase.Free;
Purchase := TPurchase.Create(2036, 122100.00, 'Project Y');
Director.ProcessRequest(Purchase);

ReadLn;
finally
Purchase.Free;
end;
except
on E:Exception do
Writeln(E.Classname, ': ', E.Message);
end;
end.

Large diffs are not rendered by default.

Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
[Stats]
EditorSecs=1
DesignerSecs=1
InspectorSecs=1
CompileSecs=280
OtherSecs=6
StartTime=12/31/15 2:42:37 PM
RealKeys=0
EffectiveKeys=0
DebugSecs=1
91 changes: 91 additions & 0 deletions Behavioral.ChainOfResponsibility/Pattern.pas
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
unit Pattern;

interface

uses SysUtils;

type

TPurchase = class
public
Number: integer;
Amount: Double;
Purpose: string;
constructor Create(num: integer; am: Double; pur: string);
end;

IApprover = interface
['{3ACA3967-FFCF-48A1-AC45-9A9B98A8DD96}']
procedure SetSuccessor(successor: IApprover);
procedure ProcessRequest(purchase: TPurchase);
end;

TApprover = class(TInterfacedObject, IApprover)
protected
FSuccessor: IApprover;
public
procedure SetSuccessor(successor: IApprover);
procedure ProcessRequest(purchase: TPurchase); virtual; abstract;
end;

TDirector = class(TApprover)
procedure ProcessRequest(purchase: TPurchase); override;
end;

TVicePresident = class(TApprover)
procedure ProcessRequest(purchase: TPurchase); override;
end;

TPresident = class(TApprover)
procedure ProcessRequest(purchase: TPurchase); override;
end;

implementation

{ TApprover }

procedure TApprover.SetSuccessor(successor: IApprover);
begin
FSuccessor := successor;
end;

{ TDirector }

procedure TDirector.ProcessRequest(purchase: TPurchase);
begin
if purchase.Amount < 10000.0 then
WriteLn(Format('Director approved request # %d', [purchase.Number]))
else if FSuccessor <> nil then
FSuccessor.ProcessRequest(purchase);
end;

{ TVicePresident }

procedure TVicePresident.ProcessRequest(purchase: TPurchase);
begin
if purchase.Amount < 25000.0 then
WriteLn(Format('VicePresident approved request # %d', [purchase.Number]))
else if FSuccessor <> nil then
FSuccessor.ProcessRequest(purchase);
end;

{ TPresident }

procedure TPresident.ProcessRequest(purchase: TPurchase);
begin
if purchase.Amount < 100000.0 then
WriteLn(Format('President approved request # %d', [purchase.Number]))
else
WriteLn(Format('Request# %d requires an executive meeting!', [purchase.Number]))
end;

{ TPurchase }

constructor TPurchase.Create(num: integer; am: Double; pur: string);
begin
Number := num;
Amount := am;
Purpose := pur;
end;

end.
34 changes: 34 additions & 0 deletions Behavioral.Command/Behavioral.Command.Pattern.dpr
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
program Behavioral.Command.Pattern;

{$APPTYPE CONSOLE}

uses
SysUtils,
Pattern in 'Pattern.pas';

var
user: TUser;

begin
ReportMemoryLeaksOnShutDown := DebugHook <> 0;
try
user := TUser.Create;
try
user.Compute('+', 100);
user.Compute('-', 50);
user.Compute('*', 10);
user.Compute('/', 2);

user.Undo(4);

user.Redo(3);

ReadLn;
finally
user.Free;
end;
except
on E:Exception do
Writeln(E.Classname, ': ', E.Message);
end;
end.
Loading

0 comments on commit 6fe750c

Please sign in to comment.