C#4中如何实现Memento模式?MementoPattern本身看起来非常简单。我正在考虑实现与维基百科示例相同的功能,但在此之前我是否有任何C#语言功能更容易实现或使用?一个明显的功能是泛型,实现一个泛型纪念品将允许您将它用于任何您想要的对象。您将看到的许多示例将使用字符串(包括当前对此问题的所有响应)作为状态,这是一个问题,因为它是.NET中的少数类型之一。当处理可变对象时(就像任何具有setter属性的引用类型),你必须记住,当你保存一个备忘录时,你需要创建一个对象的深拷贝。否则,每次更改原始对象时,都会更改纪念品。您可以使用像protobuf-net或json.net这样的序列化器来做到这一点,因为它们不需要您像普通的.net序列化机制那样用可序列化的属性标记您的对象。Codeproject几乎没有关于通用备忘录实现的文章,但他们倾向于跳过deepcopy部分:C#Memento设计模式中具有撤消-重做的通用Memento模式我不知道有任何已经内置的方式来支持Memento模式。我已经看到了几个使用.NETMock框架的实现,其中实际创建了对象的克隆并且可以用数据进行处理,但我认为这是一种开销。通常在撤消/重做上使用Memento模式,也许你也是。这种情况下,还是尽量减少Undo/Redo栈上的数据比较好,所以一个自定义的可撤销对象就是我想要的。希望这可以帮助。使此模式在C#中编写速度更快的一件事是任何状态字段都可以声明为公共只读,因此您不需要属性或“get”方法来访问它们。这是一个包括publicreadonly的直接转换。类Originator{私有字符串状态;//该类还可以包含不属于保存在备忘录中的//状态的附加数据。publicvoidSet(stringstate){Console.WriteLine("Originator:Settingstateto"+state);this.state=状态;}publicMementoSaveToMemento(){Console.WriteLine("Originator:SavingtoMemento.");返回新的纪念品(状态);}publicvoidRestoreFromMemento(Mementomemento){state=memento.SavedState;Console.WriteLine("Originator:从Memento恢复后的状态:"+state);}publicclassMemento{publicreadonlystringSavedState;publicMemento(stringstateToSave){SavedState=stateToSave;}}}classCaretaker{staticvoidMain(string[]args){列表savedStates=newList();发起人originator=newOriginator();originator.Set("State1");originator.Set("State2");savedStates.Add(originator.SaveToMemento());originator.Set("State3");//我们可以请求多个纪念品,并选择whichone回滚到。savedStates.Add(originator.SaveToMemento());originator.Set("State4");originator.RestoreFromMemento(savedStates[1]);我在这里找到了一个使用泛型的人:#regionOriginatorpublicclassOriginator{#regionPropertiespublicTState{get;放;}#endregion#region方法//////创建一个新的备忘录来保存当前///状态//////创建的备忘录publicMementoSaveMemento(){return(newMemento(State));}//////恢复保存在给定备忘录中的状态//////给定备忘录publicvoidRestoreMemento(Mementomemento){State=memento.State;}#endregion}#endregion#regionMementopublicclassMemento{#regionPropertiespublicTState{get;私有集;}#endregion#regionCtor//////用给定的状态构造一个新的备忘录对象//////给定的状态publicMemento(Tstate){State=state;}#endregion}#endregion#regionCaretakerpublicclassCaretaker{#regionPropertiespublicMementoMemento{get;放;}#endregion}#endregion#regionOriginatorpublicclassOriginator{#regionPropertiespublicTState{get;放;}#endregion#region方法//////创建一个新的备忘录来保存当前的///状态//////创建的备忘录publicMementoSaveMemento(){return(newMemento(State));}//////恢复保存在给定备忘录中的状态//////给定备忘录publicvoidRestoreMemento(Mementomemento){State=memento.State;}#endregion}#endregion#regionMementopublicclassMemento{#regionPropertiespublicTState{get;私有集;}#endregion#regionCtor//////用给定的状态构造一个新的备忘录对象//////给定的状态publicMemento(Tstate){State=state;}#endregion}#endregion#regionCaretakerpublicclassCaretaker{#regionPropertiespublicMementoMemento{get;放;}#endregion}#endregion像这样使用:Originatororg=newOrig启动器();org.State="旧州";//将内部状态存储在caretaker对象中Caretakercaretaker=newCaretaker();caretaker.Memento=org.SaveMemento();Console.WriteLine("这是旧状态:{0}",org.State);org.State="新状态";Console.WriteLine("这是新状态:{0}",org.State);//从caretakerorg恢复保存的状态.RestoreMemento(caretaker.Memento);Console.WriteLine("旧状态已恢复:{0}",org.State);//等待用户Console.Read();正如@SimonSkovBoisen提到的,这只适用于不可变数据,需要深拷贝以上是C#学习教程:HowtoimplementtheMementopatterninC#4?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
