備忘錄模式是什么
備忘錄模式是一種行為設計模式, 允許在不暴露物件實作細節的情況下保存和恢復物件之前的狀態,
為什么要用備忘錄模式
當你需要創建物件狀態快照來恢復其之前的狀態時,可以使用備忘錄模式,或者當直接訪問物件的成員變數、獲取器或設定器將導致封裝被突破時, 可以使用該模式,
備忘錄模式怎么實作
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())
}
優點
- 你可以在不破壞物件封裝情況的前提下創建物件狀態快照,
- 你可以通過讓負責人維護原發器狀態歷史記錄來簡化原發器代碼,
缺點
- 如果客戶端過于頻繁地創建備忘錄, 程式將消耗大量記憶體,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/462948.html
標籤:設計模式
下一篇:PHP設計模式—享元模式
