備忘錄模式是什麼 備忘錄模式是一種行為設計模式, 允許在不暴露對象實現細節的情況下保存和恢復對象之前的狀態。 為什麼要用備忘錄模式 當你需要創建對象狀態快照來恢復其之前的狀態時,可以使用備忘錄模式。或者當直接訪問對象的成員變數、獲取器或設置器將導致封裝被突破時, 可以使用該模式。 備忘錄模式怎麼實現 ...
備忘錄模式是什麼
備忘錄模式是一種行為設計模式, 允許在不暴露對象實現細節的情況下保存和恢復對象之前的狀態。
為什麼要用備忘錄模式
當你需要創建對象狀態快照來恢復其之前的狀態時,可以使用備忘錄模式。或者當直接訪問對象的成員變數、獲取器或設置器將導致封裝被突破時, 可以使用該模式。
備忘錄模式怎麼實現
memento.go 備忘錄
備忘錄用來保持對象的狀態。
package memento
type memento struct {
state string
}
func (m *memento) getSavedState() string {
return m.state
}
originator.go 發起者
originator是基礎對象。它會將自己的狀態保持到備忘錄。
package memento
type originator struct {
state string
}
func (e *originator) createMemento() *memento {
return &memento{state: e.state}
}
func (e *originator) restoreMemento(m *memento) {
e.state = m.getSavedState()
}
func (e *originator) setState(state string) {
e.state = state
}
func (e *originator) getState() string {
return e.state
}
caretaker.go 管理者
保存多條備忘錄的對象並且維護著它們的索引,以便獲取。
package memento
type caretaker struct {
mementoArray []*memento
}
func (c *caretaker) addMemento(m *memento) {
c.mementoArray = append(c.mementoArray, m)
}
func (c *caretaker) getMemento(index int) *memento {
return c.mementoArray[index]
}
example.go 客戶端調用示例
package memento
import "fmt"
func Example() {
caretaker := &caretaker{
mementoArray: make([]*memento, 0),
}
originator := &originator{
state: "A",
}
fmt.Printf("Originator Current State: %s\n", originator.getState())
caretaker.addMemento(originator.createMemento())
originator.setState("B")
fmt.Printf("Originator Current State: %s\n", originator.getState())
caretaker.addMemento(originator.createMemento())
originator.setState("C")
fmt.Printf("Originator Current State: %s\n", originator.getState())
caretaker.addMemento(originator.createMemento())
originator.restoreMemento(caretaker.getMemento(1))
fmt.Printf("Restored to State: %s\n", originator.getState())
originator.restoreMemento(caretaker.getMemento(0))
fmt.Printf("Restored to State: %s\n", originator.getState())
}
優點
- 你可以在不破壞對象封裝情況的前提下創建對象狀態快照。
- 你可以通過讓負責人維護原發器狀態歷史記錄來簡化原發器代碼。
缺點
- 如果客戶端過於頻繁地創建備忘錄, 程式將消耗大量記憶體。