示例:备忘录接口 说明: (1)、定义 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。 (2)、结构 Memento(备忘录):备忘录存储原发器对象的内部状态。原发器根据需要决定备忘录存储原发器的哪些内部状态。防止原发器以外的其他对象访问备忘录。备忘录实际上有两个接口,管理者(caretaker)只能看到备忘录的窄接口-它只能将备忘录传递给其他对象。相反,原发器能够看到一个宽接口,允许它访问返回到先前状态所需的所有数据。理想的情况是只允许生成本备忘录的那个原发器访问本备忘录的内部状态。 Originator(原发器):原发器创建一个备忘录,用以记录当前时刻它的内部状态。使用备忘录恢复内部状态.。备忘录是被动的。只有创建备忘录的原发器会对它的状态进行赋值和检索。 Caretaker(负责人):负责保存好备忘录。不能对备忘录的内容进行操作或检查。 界面: object Form2: TForm2 Left = 192 Top = 120 Width = 244 Height = 107 Caption = 'Form2' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False OnCreate = FormCreate OnDestroy = FormDestroy PixelsPerInch = 96 TextHeight = 13 object Button1: TButton Left = 40 Top = 32 Width = 75 Height = 25 Caption = '操作' TabOrder = 0 OnClick = Button1Click end object Button2: TButton Left = 136 Top = 32 Width = 75 Height = 25 Caption = '恢复' TabOrder = 1 OnClick = Button2Click end end 代码: unit uMemento; interface {注:Delphi没有friend指令;但在同一单元内所有对象皆可以存取 其它对象中宣告私有的部分;亦即皆为朋友的关系。} uses Dialogs; type {状态} TState = class private FValue: string; public procedure Assign(const AState: TState); //--- property Value: string read FValue write FValue; end; {备忘录} TMemento = class private FState: TState; function GetState: TState; procedure SetState(const Value: TState); protected property State: TState read GetState write SetState; public constructor Create(AState: TState); destructor Destroy; override; end; {原发器} TOrigintor = class private FState: TState; public constructor Create; destructor Destroy; override; //--- function CreateMemento: TMemento; procedure SetMemento(AMemento: TMemento); //---- procedure Operate(const Value:string); procedure Show; end; {负责人} TCaretaker = class private FMemento: TMemento; procedure SetMemento(const Value: TMemento); public constructor Create; destructor Destroy; override; //--- property Memento: TMemento read FMemento write SetMemento; end; implementation function TOrigintor.CreateMemento: TMemento; begin Result := TMemento.Create(FState); end; procedure TOrigintor.SetMemento(AMemento: TMemento); begin FState.Assign(AMemento.State); end; procedure TOrigintor.Show; begin ShowMessage(FState.Value); end; procedure TOrigintor.Operate(const Value:string); begin FState.Value := Value; end; constructor TMemento.Create(AState: TState); begin FState := TState.Create; self.SetState(AState); end; destructor TMemento.Destroy; begin FState.Free; //--- inherited; end; function TMemento.GetState: TState; begin Result := FState; end; procedure TMemento.SetState(const Value: TState); begin FState.Assign(Value); end; constructor TCaretaker.Create; begin FMemento := nil; end; destructor TCaretaker.Destroy; begin self.Memento := nil; //--- inherited; end; procedure TCaretaker.SetMemento(const Value: TMemento); begin if FMemento <> nil then FMemento.Free; FMemento := Value; end; { TState } procedure TState.Assign(const AState: TState); begin self.FValue := AState.FValue; end; constructor TOrigintor.Create; begin FState := TState.Create; end; destructor TOrigintor.Destroy; begin FState.Free; //--- inherited; end; end. unit Unit2; interface uses Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms, Dialogs,StdCtrls,uMemento; type TForm2 = class(TForm) Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormCreate(Sender: TObject); private FOrigintor: TOrigintor; FCaretaker: TCaretaker; public { Public declarations } end; var Form2: TForm2; implementation {$R *.dfm} procedure TForm2.Button1Click(Sender: TObject); begin with FOrigintor do begin FCaretaker.Memento := CreateMemento; //--- Operate(DateTimeToStr(Now)); Show; end; end; procedure TForm2.Button2Click(Sender: TObject); begin with FOrigintor do begin SetMemento(FCaretaker.Memento); Show; end; end; procedure TForm2.FormCreate(Sender: TObject); begin FOrigintor := TOrigintor.Create; FCaretaker := TCaretaker.Create; end; procedure TForm2.FormDestroy(Sender: TObject); begin FOrigintor.Free; FCaretaker.Free; end; end.