2013-10-22 82 views
0

我已經檢查過每一個地方,並閱讀了無數的文章。我甚至在一些中文論壇上尋找答案。事情是我不能完全理解C#的紀念模式。不同的文章展示了不同的方式,我無法正確理解它。大多數文章只顯示簡單的東西,如字符串紀念品。我想了解如何做一個撤消功能,需要幫助,而且,你如何做一個公共部分類的撤消功能?,我只需要一個小例子顯示公共部分類的紀念品。提前致謝。關於紀念品的一些解釋

+0

爲什麼要一個分部類的行爲有什麼不同,關於紀念? – McGarnagle

+0

你有看到這個嗎?清晰的描述和簡單的例子。 http://social.msdn.microsoft.com/Forums/en-US/e0a108e1-484b-4b5d-83f6-48729f712353/memento-design-pattern?forum=Vsexpressvcs – McGarnagle

回答

1

基本上,紀念是一種保存和恢復對象狀態的方法。但是它超出了這個範圍:這是一種保留封裝的方式。因此,如果要保存其狀態的對象具有一些私人成員,則備忘錄模式是以有限方式訪問這些成員的一種方式。

舉個例子,假設我們有一個2D人物做周邊的地圖醉酒散步:

public class Sprite 
{ 
    private double _x = 0, _y = 0; 
    public void Run() 
    { 
     var random = new byte[2]; 
     new Random().NextBytes(random); 
     _x += (double)random[0]; 
     _y += (double)random[1]; 
    } 

    public void Render() 
    { 
     Console.WriteLine("({0}, {1})", _x, _y); 
    } 
} 

比方說,我們不想暴露x和y作爲公共成員,但我們要能夠保存對象的狀態。然後,我們可以創建一個封裝對象的狀態留念類:

public class SpriteMemento 
{ 
    public double X { get; set; } 
    public double Y { get; set; } 
} 

Sprite類可以接受留念的對象,以恢復其狀態,並提供一個節省:

public class Sprite 
{ 
    // ... 

    public SpriteMemento Memento 
    { 
     get { return new SpriteMemento { X = _x, Y = _y }; } 
    } 

    public void Restore(SpriteMemento memento) 
    { 
     if (memento == null) 
      return; 

     _x = memento.X; 
     _y = memento.Y; 
    } 
} 

現在,讓我們說我們有另一個控制運行的類。現在,我們可以將這個類提供了一個「撤銷」功能:

static void Main(string[] args) 
{ 
    var sprite = new Sprite(); 
    SpriteMemento state = null; 
    while (true) 
    { 
     string input = Console.ReadLine(); 
     if (input == "run") 
      sprite.Run(); 
     else if (input == "save") 
      state = sprite.Memento; 
     else if (input == "undo") 
      sprite.Restore(state); 

     sprite.Render(); 
    } 
} 

至於部分類,實在沒有什麼區別 - 只是釘在「局部」的Sprite類以上,並且紀念圖案仍然完好無損。

參考:Memento Design Pattern