问题标签 [memento]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 如何从 Catel 的 MementoService 中获取带有 PropertyChangeUndo 对象的 UNDO 堆栈?
我正在开发一个具有撤消/重做机制的应用程序。我使用 Catel MVVM 框架。我使用 Catel.Memento 进行撤消/重做。我得到了它,但我想在列表中显示重做对象列表。
我的问题是:如何从 MementoService 获取重做对象?我想知道每个对象的旧值、新值和属性名。
c# - 自包含的通用纪念品
亲爱的程序员,
我似乎对 C# 中的引用如何工作缺乏一些了解。
案例:
我试图实现某种 Memento 代理,它会包装一个接口并存储我们提供给方法调用的每个参数,并将它们存储到一个列表中。
必要时我们可以调用 RestoreState 并且对象将“重置”到原始状态。
代码:
消费者和模型对象
纪念
额外信息
我的猜测是,我在做/理解关于列表的一些错误。
我还尝试了 Interlocked.Exchange,玩弄“ref”,使用 WeakReference 并将对象存储到 CareTaker 对象中(并将 CareTaker 存储到列表中),实现一些复制属性的东西......
而且......我只是看不到它。
我的预期结果将是 PrestationInfo.Advance 包含值 2 的属性。但它保持
state - 在 Memento 模式中无法访问抽象状态模式中的吸气剂
我在将状态抽象方法中的一些变量保存到备忘录模式中的文件时遇到问题。错误是“范围内不可访问”。
以下是代码片段:
州级。
纪念品课。
我知道它不应该工作,但如何解决它?
java - 备忘录模式的缺点
因此,这里是 Memento 模式的典型实现(跳过的 getter 和 setter)。
我发现的这种模式的所有实现都或多或少等于上面的那个。但是这种实现存在一些问题,我不喜欢:
- 可以同时触发
employee.revert()
和caretaker.revert(employee)
。我希望只有一个接入点。 - 如果我们想更改 EmployeeMemento,我们还必须在 Employee 类中进行更改(因为
revert
方法)。
有没有办法克服这个问题?又或者是我太注意了,这个细节没那么重要?
c# - 通用字段更改事件
我目前正在尝试为数百个类制作一个 Logger,它会监听 3 个属性的变化,并在它们发生变化时创建一条日志消息。
我会在被侦听对象的构造函数中传递 3 属性,但我需要一个OnPropertyChanged事件到此类中以侦听它们的更改。
(我不能把它写到被监听对象的属性设置器中。)
这个计划甚至有可能实施吗?如果没有,你能建议我另一种选择吗?
orm - 使用 Factory 进行映射和重构的域模型快照
我在《DDD 的模式、原则和实践》一书中读到,如果你想完全封装你的领域模型,你可以将其属性设为私有并使用Memento模式来阅读它们。还有一个示例,存储库获取域模型的快照,然后映射到数据库模型并将其更改保存到数据库。它还从 db 检索数据库模型,将其映射到快照,然后使用工厂模式从快照重构域模型并使用它。
- 当您可以将数据库模型映射到域模型而不使用工厂或快照时,我对这里完成了多少工作感到有点困惑。这不是更容易吗?
如果我们要照书看,将Domain模型快照从服务层返回到表示层,然后映射到一个View Model,是不是正确的方法呢?或者在表示层创建快照并将其传递给服务层,使用工厂模式在那里重构它,然后将域模型传递到存储库,在那里它将再次拍摄其快照以映射到数据库模型并保存到D b....
当您需要使用如此复杂的映射架构时,您能举一些例子吗?
当可以更简单地完成时,真的感觉就像您正在编写复杂的代码。
更新
如果更容易理解我的要求,我可以放置代码示例。;)
eclipse-plugin - 如何使用 IMemento 存储视图部分的所有信息?
我有使用扩展 ViewPart 的视图的 eclipse 插件。ViewPart 有一个需要 IMemento 的 saveState 方法。我将我的代码添加到 saveState 和相应的 init-Method 并且它可以工作。
我创建了 3 个哈希图。
1) hmTextONLY: 它只包含文本值。(列名(ColumnIndex):Threarname(1),categoryname(2),description(5),justification(6))
2)hmCOMBO1ONLY:它只包含combobox1值。(列名(列索引):状态(3))
3)hmCOMBO2ONLY:它只包含combobox2值。(列名(列索引):优先级(4))
这里的方法描述,在代码中使用。
init:初始化视图。
createPartControl:在视图部分创建表。
fillRows:表格中的数据,来自这个方法。一行一行。saveState:此方法对保存数据很有用。仅在整个工作区关闭时才调用 saveState。
saveState:用于在关闭应用程序时保存工作区。
问题: 1)如何使用保存状态方法顺序保存整个表数据(文本混合,组合框)?我在 saveState 方法中创建了一个子表单 Id1。
代码:
上述代码的当前输出:
design-patterns - 如何使用 memento 设计模式保存多个对象的状态?
我对纪念品应该如何实施感到非常困惑。
我了解Memento有一个State。备忘录模式用于存储不同的(以前的)状态,以便可以将对象恢复到以前的状态,
好吧,假设我有多个对象,每个对象都有 10 个属性,其中 5 个在每个对象的生命周期中保持不变,但其中 5 个会发生变化。所以我需要,为每个对象保存它以前的状态并返回它们。
问题:
如何对这些对象应用备忘录模式?
到目前为止我的想法:
所以Memento Pattern有 3 个类,你创建了很多Memento,每个状态一个。存储对象 AKA Mementos的所有先前状态的看守者。然后是创建Mementos并从Memento获取状态的Originator。
这意味着每个对象实例都需要它自己的看守人实例(它以前状态的列表),并且这个看守人将拥有带有该对象的 5 个属性的以前状态的纪念品(以及当前状态还是只有以前的状态?),但是所有具有看守者的对象都可以使用相同的Originator 实例,因为可以使用Originator为任何看守者创建新的纪念品。
这是如何实施还是我误解了它?
它看起来像这样:
Originator 和 Memento 类
其他对象
另外的选择
将使 Memento 类和 Originator 类拥有 5 个属性,而不是将 5 个属性封装在另一个类中。像这样:
这样,每个 Object1 实例都将拥有自己的 Originator 实例而不是 Object1Attributes,并且此 Originator 将包含 object1 实例中属性的当前状态;我不知道哪种方式是实现模式的正确方式。
所有在线示例都使用 mementos 来存储只是一个字符串的“状态”,它们都不涉及创建可以具有多个状态的多个对象,所以这就是我如此不确定的原因。
java - Java中的Memento模式——内部类的序列化
免责声明 - 这是学校学期项目的一部分。
我们应该使用备忘录模式来保存对象状态。这个对象是 MVC 中的一个模型。所以我现在的方式是(简化的):
我已经读过,出于合理的原因,在 Java 中实际上不可能有一个可序列化的内部类而外部类不是。但是,在我的情况下,当内部类是时,我不需要实例化外部类。内在根本不需要外在。它的结构只有这样,以便外部类可以访问内部的成员。
这就是我课程的纪念品描述中所说的:
......这也是有道理的。只有模型应该能够访问 Memento 中的详细信息。“看守人”对象(处理将数据保存到磁盘/从磁盘检索数据的对象)不应在对象内部看到。由于Java没有友元类,这应该是要走的路。
这是否意味着为了按照建议实施它,我不能使用序列化?
编辑:
我将 Memento 类和 Stats 类设为静态,但仍然出现错误。好像还是有this
参考的Model.Stats
c++ - 纪念品设计模式
这是我的代码:
typedef void(Number:: *Action)()
上面程序中的语句有什么意义?它是函数指针,那么函数定义在哪里?