快捷搜索:

Net设计模式实例之备忘录模式(Memento Pattern)

一、备忘录模式简介(Brief Introduction)

备忘录模式(Memento Pattern),在不破坏封装的条件下,捕获一个工具的内部状态,并在该工具之外保存这个状态。这样今后就可以就该工具规复到本来保存的状态。

二、办理的问题(What To Solve)

当系统功能对照繁杂,而且必要记录历史属性以便当必要时做规复动作。Originator可以根据保存的Memento信息还原到前一状态。

三、备忘录模式阐发(Analysis)

1、备忘录模式布局

Originator类:提议人。

CreateMemento措施,认真创建一个备忘录,用于记录当前时候它的内部状态。

SetMemento措施,应用备忘录回覆状态。

Show措施,展示状态。

Originator类:可以抉择备忘录Memento存储Originator的哪些状态。

Memento类:备忘录,认真存储Originator的内部状态,并可防止Originator以外的其他工具造访备忘录Memento

Caretaker类:认真保存备忘录Memento,不能对备忘录的内容进行操纵和反省。

2、备忘录模式代码

1、提议人类Originator

public class Originator

{

private string _state;

public string State

{

get { return _state; }

set { _state = value; }

}

///

/// 创建备忘录,将当前要保存的信息导入并实例化备忘录

///

public Memento CreateMemento()

{

return (new Memento(this.State));

}

///

/// 规复备忘录,将Memento导入并将相关数据规复

///

///

public void SetMemento(Memento memento)

{

this.State = memento.State;

}

///

/// 展示状态数据

///

public void Show()

{

Console.WriteLine("当前状态是:"+this.State);

}

}

2、备忘录类Memento

public class Memento

{

private string _state;

public string State

{

get { return _state; }

set { _state = value; }

}

public Memento(string state)

{

this.State = state;

}

}

3、治理者类Caretaker

public class Caretaker

{

private Memento _memento;

public Memento Memento

{

get { return _memento; }

set { _memento = value; }

}

}

4、客户端代码

static void Main(string[] args)

{

Originator o = new Originator();

//初始状态为On

o.State = "On";

o.Show();

//创建备忘录并保存状态

Caretaker caretaker = new Caretaker();

caretaker.Memento=o.CreateMemento();

//变动Originator状态=Off

o.State = "Off";

o.Show();

//规复到原始状态

o.SetMemento(caretaker.Memento);

o.Show();

Console.ReadKey();

}

3、备忘录模式运行结果

四.实例阐发(Example)

1、场景

首先定义贩卖代理Noel van Halen的相关信息.然后保存到备忘录中,而定义贩卖代理Leo Welch相关信息。然后又答复前一代理Noel van Halen的信息。。布局如下图所示

SalesProspect类:提议人

SaveMemento措施:创建备忘录

RestoreMemento措施:答复备忘录

Memento类:备忘录,必要备份的信息有姓名、电话和预算

ProspectMemory类:认真保存备忘录Memento

2、代码

1、提议人类SalesProspect

class SalesProspect

{

private string _name;

private string _phone;

private double _budget;

public string Name

{

get { return _name; }

set

{

_name = value;

Console.WriteLine("Name:" + _name);

}

}

public string Phone

{

get { return _phone; }

set

{

_phone = value;

Console.WriteLine("Phone: " + _phone);

}

}

public double Budget

{

get { return _budget; }

set

{

_budget = value;

Console.WriteLine("Budget: " + _budget);

}

}

public Memento SaveMemento()

{

Console.WriteLine("\nSaving state --\n");

return new Memento(_name, _phone, _budget);

}

public void RestoreMemento(Memento memento)

{

Console.WriteLine("\nRestoring state --\n");

this.Name = memento.Name;

this.Phone = memento.Phone;

this.Budget = memento.Budget;

}

}

2、备忘录类Memento

class Memento

{

private string _name;

private string _phone;

private double _budget;

public Memento(string name, string phone, double budget)

{

this._name = name;

this._phone = phone;

this._budget = budget;

}

public string Name

{

get { return _name; }

set { _name = value; }

}

public string Phone

{

get { return _phone; }

set { _phone = value; }

}

public double Budget

{

get { return _budget; }

set { _budget = value; }

}

}

3、治理者类ProspectMemory

class ProspectMemory

{

private Memento _memento;

// Property

public Memento Memento

{

set { _memento = value; }

get { return _memento; }

}

}

3、客户端代码

static void Main(string[] args)

{

SalesProspect s = new SalesProspect();

s.Name = "Noel van Halen";

s.Phone = "(412) 256-0990";

s.Budget = 25000.0;

// Store internal state

ProspectMemory m = new ProspectMemory();

m.Memento = s.SaveMemento();

// Continue changing originator

s.Name = "Leo Welch";

s.Phone = "(310) 209-7111";

s.Budget = 1000000.0;

// Restore saved state

s.RestoreMemento(m.Memento);

Console.ReadKey();

}

3、实例运行结果

五、总结(Summary)

本文对备忘录模式设计思惟、布局和布局代码进行了阐发,并以一实例进一步阐述了备忘录模式的C#实现。

转自:http://www.cnblogs.com/ywqu/archive/2010/01/25/1655581.html

您可能还会对下面的文章感兴趣: