成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go設(shè)計模式--備忘錄模式,帶暫存的業(yè)務(wù)功能可以參考它來實現(xiàn)

開發(fā) 前端
備忘錄模式是一種行為型設(shè)計模式。這種模式允許我們保存對象在某些關(guān)鍵節(jié)點時的必要信息,以便于在適當(dāng)?shù)臅r候可以將之恢復(fù)到之前的狀態(tài)。通常它可以用來幫助設(shè)計撤銷/恢復(fù)操作。

大家好,這里是每周都在陪你一起進步的網(wǎng)管~!今天繼續(xù)學(xué)習(xí)設(shè)計模式—備忘錄模式

備忘錄模式(Memento Pattern)又叫作快照模式(Snapshot Pattern), 或令牌模式(Token Pattern), 指在不破壞封裝的前提下, 捕獲一個對象的內(nèi)部狀態(tài), 并在對象之外保存這個狀態(tài)。 這樣以后就可將該對象恢復(fù)到原先保存的狀態(tài), 屬于行為型設(shè)計模式。

備忘錄模式主要適用于以下應(yīng)用場景。

  1. 需要保存歷史快照的場景。
  2. 希望在對象之外保存狀態(tài),且除了自己,其他類對象無法訪問狀態(tài)保存的具體內(nèi)容。

備忘錄模式是一種行為型設(shè)計模式。這種模式允許我們保存對象在某些關(guān)鍵節(jié)點時的必要信息,以便于在適當(dāng)?shù)臅r候可以將之恢復(fù)到之前的狀態(tài)。通常它可以用來幫助設(shè)計撤銷/恢復(fù)操作。

備忘錄模式的類結(jié)構(gòu)

下面是備忘錄模式的類圖,

圖片來自https://refactoringguru.cn/design-patterns/memento,我后面實現(xiàn)的時候不會完全按照這個結(jié)構(gòu)去實現(xiàn),這里先把結(jié)構(gòu)里的各個角色給大家說清楚。

圖片

備忘錄模式中主要有這三個角色的類

  • Originator(發(fā)起者):Originator是當(dāng)前的基礎(chǔ)對象,它會將自己的狀態(tài)保存進備忘錄,此角色可以類比博客系統(tǒng)中的文章對象
  • 發(fā)起者中要有保存方法和從備忘錄中恢復(fù)狀態(tài)的方法,保存方法會返回當(dāng)時狀態(tài)組成的備忘錄對象
  • Memento(備忘錄) : 存儲著Originator的狀態(tài)的對象,類比理解即為文章對象的不同版本。
  • Caretaker(管理人):Caretaker是保存著多條備忘錄的對象,并維護著備忘錄的索引,在需要的時候會返回相應(yīng)的備忘錄 -- 類比理解為博客系統(tǒng)中的編輯器對象
  • 管理者的保存和恢復(fù)操作,會代理其持有的發(fā)起者對象的保存和恢復(fù)操作,在這些代理方法中會增加對備忘錄對象列表、當(dāng)前備忘錄版本的維護。

上面這個類圖結(jié)構(gòu)是實現(xiàn)備忘錄模式的最簡單方式,真實使用的時候,Caretaker,Originator、memento 這些角色可以繼續(xù)抽象出對應(yīng)的接口和實現(xiàn)。這里就不搞那么復(fù)雜了,要舉的例子比較簡單,這么一拆顯得這個模式用起來特別費事兒。

其實其他設(shè)計模式也是一樣,學(xué)習(xí)的時候大家知道了它的結(jié)構(gòu)后,在實現(xiàn)應(yīng)用的環(huán)節(jié)不必完完全全按照結(jié)構(gòu)一板一眼地全部進行實現(xiàn),有的應(yīng)用場景并不復(fù)雜,能合并的角色可以按需進行合并。

應(yīng)用舉例

場景

某線上博客平臺, 需為用戶提供在線編輯文章功能,文章主要包括標(biāo)題 - title 和內(nèi)容 - content等信息。為最大程度防止異常情況導(dǎo)致編輯內(nèi)容的丟失, 需要提供版本暫存和Undo, Redo功能。

"版本暫存"問題可以應(yīng)用備忘錄模式, 將編輯器的狀態(tài)完整保存起來(主要就是編輯內(nèi)容),Undo和Redo的本質(zhì), 是在歷史版本中前后移動把當(dāng)時保存的內(nèi)容加載到文章對象上。

方案設(shè)計

  • IEditor: 定義編輯器接口
  • EditorMemento: 定義編輯器的備忘錄, 也就是編輯器的內(nèi)部狀態(tài)數(shù)據(jù)模型, 同時也對應(yīng)一個歷史版本
  • Editor: 編輯器類, 實現(xiàn)IEditor接口

圖片

這個例子里我們把原發(fā)器和管理人兩個角色集中在Editor類型上一起實現(xiàn),例子比較簡單,就沒有單獨實現(xiàn)一個Article類型作為原發(fā)器角色,如果你想完全按照備忘錄模式的結(jié)構(gòu)實現(xiàn),把Title、Content這寫屬性和Save方法抽離到單獨的Article類型上,再讓Editor嵌套組合Article即可。

下面我們根據(jù)UML類圖實現(xiàn)一下這個帶Undo、Redo功能的編輯器。

代碼實現(xiàn)

首先在IEditor 接口里定義編輯器對象要實現(xiàn)的行為

// 編輯器接口定義
type IEditor interface {
Title(title string)
Content(content string)
Save()
Undo() error
Redo() error
Show()
}

接下來定義編輯器的備忘錄, 也就是編輯器的內(nèi)部狀態(tài)數(shù)據(jù)模型, 同時也對應(yīng)一個歷史版本。

"本文使用的完整可運行源碼
去公眾號「網(wǎng)管叨bi叨」發(fā)送【設(shè)計模式】即可領(lǐng)取"
type Memento struct {
title string
content string
createTime int64
}

func newMemento(title string, content string) *Memento {
return &Memento{
title, content, time.Now().Unix(),
}
}

然后是最復(fù)雜的Editor實現(xiàn),它會實現(xiàn)上面IEditor接口中定義的所有行為,其中的Undo、Redo方法即回退、前進方法在實現(xiàn)的時候就是依賴的它內(nèi)部記錄的一組Memento對象,通過指向不同的Memento對象來實現(xiàn)回退和前進功能。

"本文使用的完整可運行源碼
去公眾號「網(wǎng)管叨bi叨」發(fā)送【設(shè)計模式】即可領(lǐng)取"
// 編輯器類, 實現(xiàn)IEditor接口
type Editor struct {
title string
content string
versions []*Memento
index int
}

func NewEditor() IEditor {
return &Editor{
"", "", make([]*Memento, 0), 0,
}
}

func (editor *Editor) Title(title string) {
editor.title = title
}

func (editor *Editor) Content(content string) {
editor.content = content
}

func (editor *Editor) Save() {
it := newMemento(editor.title, editor.content)
editor.versions = append(editor.versions, it)
editor.index = len(editor.versions) - 1
}

func (editor *Editor) Undo() error {
return editor.load(editor.index - 1)
}

func (editor *Editor) load(i int) error {
size := len(editor.versions)
if size <= 0 {
return errors.New("no history versions")
}

if i < 0 || i >= size {
return errors.New("no more history versions")
}

it := editor.versions[i]
editor.title = it.title
editor.content = it.content
editor.index = i
return nil
}

func (editor *Editor) Redo() error {
return editor.load(editor.index + 1)
}

func (editor *Editor) Show() {
fmt.Printf("MockEditor.Show, title=%s, cnotallow=%s\n", editor.title, editor.content)
}

最后我們來測試一下Editor的版本記錄功能

"本文使用的完整可運行源碼
去公眾號「網(wǎng)管叨bi叨」發(fā)送【設(shè)計模式】即可領(lǐng)取"
func main() {
editor := NewEditor()

// test save()
editor.Title("唐詩")
editor.Content("白日依山盡")
editor.Save()

editor.Title("唐詩 登鸛雀樓")
editor.Content("白日依山盡, 黃河入海流. ")
editor.Save()

editor.Title("唐詩 登鸛雀樓 王之渙")
editor.Content("白日依山盡, 黃河入海流。欲窮千里目, 更上一層樓。")
editor.Save()

// test show()
fmt.Println("-------------Editor 當(dāng)前內(nèi)容-----------")
editor.Show()

fmt.Println("-------------Editor 回退內(nèi)容-----------")
for {
e := editor.Undo()
if e != nil {
break
} else {
editor.Show()
}
}

fmt.Println("-------------Editor 前進內(nèi)容-----------")
for {
e := editor.Redo()
if e != nil {
break
} else {
editor.Show()
}
}
}

運行程序后會有類似下面的顯示

圖片


責(zé)任編輯:武曉燕 來源: 網(wǎng)管叨bi叨
相關(guān)推薦

2020-11-02 10:41:33

備忘錄模式

2023-10-07 00:14:53

2023-10-31 09:07:16

備忘錄模式保存

2018-08-02 17:39:42

iPhone備忘錄iOS

2024-05-15 17:41:37

備忘錄模式多線程

2025-02-17 14:48:14

2022-04-07 08:00:00

Javascript開發(fā)

2018-12-24 21:40:12

2017-03-21 11:02:59

基礎(chǔ)深度學(xué)習(xí)備忘錄

2011-08-16 18:38:23

Core Animat動畫

2011-04-11 10:03:32

錢伯斯思科

2014-04-17 10:30:41

Linux 命令黑白備忘錄

2023-10-10 15:26:30

內(nèi)存泄露OOM

2023-04-10 09:20:13

設(shè)計模式訪客模式

2023-05-04 08:47:31

命令模式抽象接口

2021-03-08 00:12:44

Grid 備忘錄 函數(shù)

2011-12-07 09:19:49

JavaJ2MEBicaVM

2021-11-07 23:41:39

Windows 11Windows微軟

2023-09-27 12:28:08

Kubernetes命令

2016-03-03 10:09:26

點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产精品欧美一区二区三区不卡 | 久久国产传媒 | 一级黄色片在线免费观看 | 亚洲av毛片| 成人av在线网站 | 中文字幕第100页 | 国产精品99 | 最新中文字幕第一页视频 | 日韩精品免费一区二区在线观看 | 日韩欧美网 | 亚洲在线| 五月激情婷婷六月 | 日韩三级电影一区二区 | 黄色国产在线视频 | 欧美精品在线播放 | 欧美日韩国产欧美 | 久久大全 | 亚洲a在线观看 | 一区二区三区四区不卡视频 | 精品久久av | 中文字幕成人av | 国产精品视频不卡 | 国精产品一品二品国精在线观看 | 久久天堂 | 国产精品色 | 伊人焦久影院 | 99精品欧美一区二区三区 | 日本成人一区二区 | 国产福利二区 | 欧美在线二区 | 国产精品日韩一区二区 | 91成人免费看 | 亚洲国产一区视频 | 成人免费影院 | 久久香蕉精品视频 | 亚洲精品久久久蜜桃 | 精品一区二区三区不卡 | 国产精品一区三区 | 毛片大全 | 中文字幕在线国产 | 欧美日韩精品在线一区 |