main.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. //备忘录是一种行为设计模式, 允许生成对象状态的快照并在以后将其还原。
  2. //
  3. //备忘录不会影响它所处理的对象的内部结构, 也不会影响快照中保存的数据。
  4. //
  5. //概念示例
  6. //备忘录模式让我们可以保存对象状态的快照。 你可使用这些快照来将对象恢复到之前的状态。 这在需要在对象上实现撤销-重做操作时非常实用。
  7. package main
  8. import "fmt"
  9. type originator struct {
  10. state string
  11. }
  12. func (e *originator) createMemento() *memento {
  13. return &memento{state: e.state}
  14. }
  15. func (e *originator) restoreMemento(m *memento) {
  16. e.state = m.getSavedState()
  17. }
  18. func (e *originator) setState(state string) {
  19. e.state = state
  20. }
  21. func (e *originator) getState() string {
  22. return e.state
  23. }
  24. type memento struct {
  25. state string
  26. }
  27. func (m *memento) getSavedState() string {
  28. return m.state
  29. }
  30. type caretaker struct {
  31. mementoArray []*memento
  32. }
  33. func (c *caretaker) addMemento(m *memento) {
  34. c.mementoArray = append(c.mementoArray, m)
  35. }
  36. func (c *caretaker) getMemento(index int) *memento {
  37. return c.mementoArray[index]
  38. }
  39. func main() {
  40. caretaker := &caretaker{
  41. mementoArray: make([]*memento, 0),
  42. }
  43. originator := &originator{
  44. state: "A",
  45. }
  46. fmt.Printf("Originator Current State: %s\n", originator.getState())
  47. caretaker.addMemento(originator.createMemento())
  48. originator.setState("B")
  49. fmt.Printf("Originator Current State: %s\n", originator.getState())
  50. caretaker.addMemento(originator.createMemento())
  51. originator.setState("C")
  52. fmt.Printf("Originator Current State: %s\n", originator.getState())
  53. caretaker.addMemento(originator.createMemento())
  54. originator.restoreMemento(caretaker.getMemento(1))
  55. fmt.Printf("Restored to State: %s\n", originator.getState())
  56. originator.restoreMemento(caretaker.getMemento(0))
  57. fmt.Printf("Restored to State: %s\n", originator.getState())
  58. }