Â è£ é¥°æ¨¡å¼ï¼å¨æå°ç»ä¸ä¸ªå¯¹è±¡æ·»å ä¸äºé¢å¤çèè´£ãå°±å¢å åè½æ¥è¯´ï¼Decorator模å¼ç¸æ¯çæåç±»æ´ä¸ºçµæ´»ã[GOF ã设计模å¼ã]
è¿å¥è¯æä¹ç解ï¼
 ä¸è¬æ¥è¯´ï¼å¢å åè½ï¼ä¸è¬æå¢å ç±»æ¬èº«çåè½ï¼å¦å¤ä¸ç§æ¯å¢å åç±»ï¼ä½æ¯ç°å®ä¸ï¼é å¢å åç±»æ¥æ»¡è¶³å®é éæ±ï¼æ¯è¿è¿ä¸å¤çï¼ç¼ºå°çµæ´»æ§ï¼
Â
è£ é¥°æ¨¡å¼ï¼å®å¼ºè°çè¦å¢å åè½ï¼ä½åä¸å 许ç产è¿å¤åç±»ï¼é£ä¹è¯¥æä¹å®ç°å¢ï¼ å®çæ导ææ³ï¼æ¯è¿è¡å 裹ï¼å±æ¬¡å 裹ãå类对象å 裹ç¶ç±»å¯¹è±¡ï¼ä¸å±ä¸å±ï¼åè½å°±ä¸å±ä¸å±ã
 1.é¦å å®ä¹ä¸ä¸ªé¦å æ½è±¡ç±»ææ¥å£ï¼
 2.å®äºä¸¤ä¸ªç»§æ¿æ½è±¡ç±»æå®ç°æ¥å£æ¹æ³çç±»ï¼ä¸ä¸ªæ¯è£ 饰类ï¼ä¸ä¸ªä¸è¬ç±»ï¼è£ 饰类ï¼å®ä¹ä¸ä¸ªæ¹æ³ï¼æ¥åç¶ç±»åï¼
Â
Â
{
Â è£ é¥°æ¨¡å¼ï¼å¼ºè°çåè½éæ¸ä¸å±å±å 裹ã æ¬ä¾åï¼ ä»¥è¥¿æ¸¸è®°ä¸ï¼åæ空ç72è¬ååï¼è¯è¯´å½å¹´ï¼
 æ空ä¸è¿åéï¼æå¸å¦èºï¼å夫æ¯ä¸å¤©å¤©é¿è¿ãè ¾äºé©¾é¾ï¼ç¿»çæï¼åç¾å¥³/æ çï¼è¿äºå夫ï¼æ¯
 ä¸ä¸å¦ä¼çã
 æ½è±¡èæç±»ï¼ä½ä¸ºç¶ç±»ã
ææ代ç åå¨ Delphi7 æµè¯éè¿
Â
}
unit Decorator;
interface
uses ComObj;
type
  {åºç¡ç±»}
 TMonkey = class(TObject)
 private
   FMonkey: TMonkey;
 public
   FGongFu: string;
   procedure Operation; virtual;
   procedure SetGongFuMonkey(Monkey: TMonkey);
   procedure WriteLog;
 end;
 {æ æ³æ¯}
 TFongFuNo = class(TMonkey)
 public
   procedure Operation; override;
 end;
 {è ¾äºé©¾é¾}
 TGongFuKey = class(TMonkey)
 public
   procedure Operation; override;
 end;
 {ç¿»çæ}
 TGongFuSomeRsault = class(TMonkey)
 public
   procedure Operation; override;
 end;
 {åæ /ç¾äºº}
 TGongFuChange = class(TMonkey)
 public
   procedure Operation; override;
   procedure AddOtherMethod;
 end;
implementation
uses Unit1;
{ TGongFuKey }
procedure TGongFuKey.Operation;
begin
 inherited;
 FGongFu := 'å·²ç»å¦ä¼è ¾äºé©¾é¾ä¹æ¯';
 WriteLog;
end;
{ TGongGuSomeRsault }
procedure TGongFuSomeRsault.Operation;
begin
 inherited;
 FGongFu := 'å·²ç»å¦ä¼ç¿»è·æ';
 WriteLog;
end;
{ TGongFuChange }
procedure TGongFuChange.AddOtherMethod;
begin
 {å¢å å ¶å®æ¹æ³}
end;
procedure TGongFuChange.Operation;
begin
 inherited;
 FGongFu := 'å·²ç»åç¾å¥³ååæ ';
 WriteLog;
 AddOtherMethod;
 {......}
end;
{ TMonkey }
procedure TMonkey.SetGongFuMonkey(Monkey: TMonkey);
begin
 FMonkey := Monkey;
end;
procedure TMonkey.Operation;
begin
 if FMonkey <> nil then
   FMonkey.Operation;
end;
procedure TMonkey.WriteLog;
begin
 Form1.Memo1.Lines.Add(FGongFu);
end;
{ TFongFuNo }
procedure TFongFuNo.Operation;
begin
 inherited;
 FGongFu := 'æ å夫,éè¦å¦ä¹ ';
 WriteLog;
end;
end.
Â
{è°ç¨}
Â
unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;
type
 TForm1 = class(TForm)
   Button1: TButton;
   Memo1: TMemo;
   procedure Button1Click(Sender: TObject);
 private
   procedure GongFun;
   { Private declarations }
 public
   { Public declarations }
 end;
var
 Form1: TForm1;
implementation
uses Decorator;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
 GongFun;
end;
procedure TForm1.GongFun;
var
 {ç´å}
 Monkey: TMonkey;
 {æ å夫}
 FongFuNo: TFongFuNo;
 {è ¾äºé©¾é¾}
 GongFuKey: TGongFuKey;
 {ç¿»çæ}
 GongFuSomeRsault: TGongFuSomeRsault;
 {åæ ãç¾å¥³}
 GongFuChange: TGongFuChange;
begin
 {ç´å}
 Monkey := TMonkey.Create;
 {æ å夫}
 FongFuNo := TFongFuNo.Create;
 {è ¾äºé©¾é¾}
 GongFuKey := TGongFuKey.Create;
 {ç¿»çæ}
 GongFuSomeRsault := TGongFuSomeRsault.Create;
 {åæ ãç¾å¥³}
 GongFuChange := TGongFuChange.Create;
 Memo1.Lines.Clear;
 {注æè£ é¥°æ¨¡å¼ä¸ï¼å¯¹è±¡å建çå å顺åºæ¯å¯ä»¥éæ¶å¯ä»¥ååç}
 {æ åµä¹ä¸ çç´å}
 {
  æ å夫,éè¦å¦ä¹
  已ç»å¦ä¼è ¾äºé©¾é¾ä¹æ¯
  已ç»å¦ä¼ç¿»è·æ
  已ç»åç¾å¥³ååæ
  }
 Form1.Memo1.Lines.Add('æ åµä¹ä¸ çç´å:  ');
 FongFuNo.SetGongFuMonkey(Monkey);
 GongFuKey.SetGongFuMonkey(FongFuNo);
 GongFuSomeRsault.SetGongFuMonkey(GongFuKey);
 GongFuChange.SetGongFuMonkey(GongFuSomeRsault);
 GongFuChange.Operation;
 Form1.Memo1.Lines.Add('                  ');
 Form1.Memo1.Lines.Add('                  ');
  {æ åµä¹äº çç´å}
  {æ å夫,éè¦å¦ä¹
   已ç»åç¾å¥³ååæ
   已ç»å¦ä¼è ¾äºé©¾é¾ä¹æ¯
   已ç»å¦ä¼ç¿»è·æ}
 Form1.Memo1.Lines.Add('æ åµä¹äº çç´å:  ');
 FongFuNo.SetGongFuMonkey(Monkey);
 GongFuChange.SetGongFuMonkey(FongFuNo);
 GongFuKey.SetGongFuMonkey(GongFuChange);
 GongFuSomeRsault.SetGongFuMonkey(GongFuKey);
 GongFuSomeRsault.Operation;
end;
end.
Â
Â
{Frm æ件}
Â
object Form1: TForm1
 Left = 297
 Top = 186
 Width = 312
 Height = 392
 Caption = 'Form1'
 Color = clBtnFace
 Font.Charset = DEFAULT_CHARSET
 Font.Color = clWindowText
 Font.Height = -11
 Font.Name = 'MS Sans Serif'
 Font.Style = []
 OldCreateOrder = False
 PixelsPerInch = 96
 TextHeight = 13
 object Button1: TButton
   Left = 8
   Top = 312
   Width = 193
   Height = 25
   Caption = 'æµè¯-çç¥æ¨¡å¼ç¨ä¾'
   TabOrder = 0
   OnClick = Button1Click
 end
 object Memo1: TMemo
   Left = 8
   Top = 8
   Width = 249
   Height = 297
   Lines.Strings = (
     'Memo1')
   TabOrder = 1
 end
end
Â