unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TAbstractString = class  
  protected
    procedure SetStr(const Value: string); virtual; abstract;
    function GetStr: string; virtual; abstract;
  public
    property Text: string read GetStr write SetStr;
  end;

  TString = class(TAbstractString)  
  private
    FText: string;
  protected
    constructor Create(const Value: string);
    procedure SetStr(const Value: string); override;
    function GetStr: string; override;
  end;

  TStringDecorator = class(TAbstractString)  
  private
    FString: TString;
  protected
    procedure SetStr(const Value: string); override;
    function GetStr: string; override;
  public
    constructor Create(AString: TString); overload; virtual;
    destructor Destroy; override;
  end;

  TUpperCaseString = class(TStringDecorator)  
  protected
    procedure SetStr(const Value: string); override;
    function GetStr: string; override;
  end;

  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    FStr: TAbstractString;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

{ TString }

constructor TString.Create(const Value: string);
begin
  FText := Value;
end;

function TString.GetStr: string;
begin
  Result := FText;
end;

procedure TString.SetStr(const Value: string);
begin
  FText := Value;
end;

{ TStringDecorator }

constructor TStringDecorator.Create(AString: TString);
begin
  FString := AString;
end;

destructor TStringDecorator.Destroy;
begin
  if Assigned(FString) then
    FString.Free;
  inherited;
end;

function TStringDecorator.GetStr: string;
begin
  Result := FString.GetStr;
end;

procedure TStringDecorator.SetStr(const Value: string);
begin
  FString.SetStr(Value);
end;

{ TUpperCaseString }

function TUpperCaseString.GetStr: string;
begin
  Result := UpperCase(FString.GetStr);
end;

procedure TUpperCaseString.SetStr(const Value: string);
begin
  inherited SetStr(UpperCase(Value));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FStr := TUpperCaseString.Create(TString.Create('hello'));
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FStr.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.Text := FStr.Text;
end;

end.

其中
  TAbstractString 等同於 Decorator 結構圖裡面的 Component 類別
  TString 等同於 Decorator 結構圖裡面的 ConcreteComponent 類別
  TStringDecorator 等同於 Decorator 結構圖裡面的 Decorator 類別
  TUpperCaseString 等同於 Decorator 結構圖裡面的 ConcreteDecorator 類別