国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【備忘錄設(shè)計模式詳解】C/Java/JS/Go/Python/TS不同語言實(shí)現(xiàn)

這篇具有很好參考價值的文章主要介紹了【備忘錄設(shè)計模式詳解】C/Java/JS/Go/Python/TS不同語言實(shí)現(xiàn)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

簡介

備忘錄模式(Memento Pattern)是一種結(jié)構(gòu)型設(shè)計模式。這種模式就是在不破壞封裝的條件下,將一個對象的狀態(tài)捕捉(Capture)住,并放在外部存儲起來,從而可以在將來合適的時候把這個對象還原到存儲起來的狀態(tài)。備忘錄模式常常與命令模式和迭代子模式一同使用。

備忘錄模式的角色有三個:備忘錄(Memento)角色、發(fā)起人(Originator)角色、負(fù)責(zé)人(Caretaker)角色

備忘錄模式是由發(fā)起人(Originator)對象負(fù)責(zé)生成狀態(tài)快照,其他對象不可修改狀態(tài)。再將對象狀態(tài)的副本存儲在一個名為備忘錄(Memento)的特殊對象中。除了創(chuàng)建備忘錄的對象外,任何對象都不能訪問備忘錄的內(nèi)容。其他對象必須使用指定接口與備忘錄進(jìn)行交互,它們可以獲取快照的元數(shù)據(jù)(創(chuàng)建時間和操作名稱等),但不能獲取快照中原始對象的狀態(tài)。

這種限制策略允許你將備忘錄保存在通常被稱為負(fù)責(zé)人(Caretakers)的對象歷史中。由于負(fù)責(zé)人僅通過受限接口與備忘錄互動,故其無法修改存儲在備忘錄內(nèi)部的狀態(tài)。同時,發(fā)起人擁有對備忘錄所有成員的訪問權(quán)限,從而能隨時恢復(fù)其以前的某個狀態(tài)。

作用

  1. 給用戶提供了一種可以恢復(fù)狀態(tài)的機(jī)制,可以使用戶能夠比較方便地回到某個歷史的狀態(tài)。
  2. 實(shí)現(xiàn)了內(nèi)部狀態(tài)的封裝,除了創(chuàng)建它的發(fā)起人之外,其他對象都不能夠訪問這些狀態(tài)信息,也不需要關(guān)心狀態(tài)的保存細(xì)節(jié)。
  3. 簡化了發(fā)起人角色,發(fā)起人不需要管理和保存其內(nèi)部狀態(tài)的各個備份,所有狀態(tài)信息都保存在備忘錄中,并由負(fù)責(zé)人進(jìn)行管理,符合單一職責(zé)原則。

實(shí)現(xiàn)步驟

  1. 創(chuàng)建備忘錄Memento,用來記錄操作狀態(tài)數(shù)據(jù)的實(shí)體類。
  2. 創(chuàng)建發(fā)起人角色Originator,狀態(tài)的制造者,也是備忘錄的生成者,負(fù)責(zé)將狀態(tài)寫入到一個新備忘錄。
  3. 創(chuàng)建負(fù)責(zé)人角色Caretaker,用來保存和讀取備忘錄的歷史記錄,所有備忘錄均可以保存在歷史中,以便恢復(fù)。
  4. 客戶調(diào)用方通過Originator來生成備忘錄,再通過Caretaker讀取和恢復(fù)備忘錄歷史記錄。

UML

?【備忘錄設(shè)計模式詳解】C/Java/JS/Go/Python/TS不同語言實(shí)現(xiàn)

?

Java代碼

具體備忘錄

// Memento.java 備忘錄(Memento)角色,負(fù)責(zé)存儲發(fā)起人傳入的狀態(tài)
public class Memento {
   private String state;

   public Memento(String state) {
      System.out.println(this.getClass().getName() + "::Memento() [state = " + state + "]");
      this.state = state;
   }

   public String getState() {
      return state;
   }

   public void setState(String state) {
      this.state = state;
   }
}

發(fā)起人

// Originator.java 發(fā)起人(Originator)負(fù)責(zé)生成狀態(tài)快照,即利用一個新備忘錄對象將自己的內(nèi)部狀態(tài)存儲起來
public class Originator {

    private String state;

    // 每次創(chuàng)建一個新備忘錄來保存狀態(tài)
    public Memento saveMemento() {
        System.out.println(this.getClass().getName() + "::saveMemento() [state = " + state + "]");
        return new Memento(state);
    }

    // 從備忘錄中恢復(fù)狀態(tài)
    public void restoreMemento(Memento memento) {
        this.state = memento.getState();
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }
}

負(fù)責(zé)人類

// Caretaker.java 負(fù)責(zé)人(Caretaker)角色,只負(fù)責(zé)保存?zhèn)渫浻涗?,不能修改備忘錄對象的?nèi)容
public class Caretaker {
    // 備忘錄可以是一個記錄,也可以就是一個對象,根據(jù)業(yè)務(wù)場景設(shè)置
    private List<Memento> mementoList = new ArrayList<Memento>();

    public void add(Memento memento) {
        System.out.println(this.getClass().getName() + "::add() [memento = " + memento.getClass().getName() + "]");
        mementoList.add(memento);
    }

    public Memento get(int index) {
        return mementoList.get(index);
    }

    public List<Memento> getMementoList() {
        return this.mementoList;
    }
}

測試調(diào)用

    /*
     * 備忘錄模式是在不暴露對象實(shí)現(xiàn)細(xì)節(jié)的情況下保存和恢復(fù)對象之前的狀態(tài)。
     * 先聲明發(fā)起人Originator,再聲明負(fù)責(zé)人Caretaker,發(fā)起人生成備忘錄Memento
     * 通過負(fù)責(zé)人則保存?zhèn)渫洑v史記錄,讀取備忘錄由負(fù)責(zé)人來完成。
     */
    Originator originator = new Originator();
    Caretaker careTaker = new Caretaker();
    // 發(fā)起人產(chǎn)生一個狀態(tài)
    originator.setState("state1");
    // 覆蓋了狀態(tài),那么前面的狀態(tài)未保存
    originator.setState("state2");
    // 發(fā)起人生成備忘錄,一般添加時直接保存即可
    Memento memento = originator.saveMemento();
    // 負(fù)責(zé)人保添加備忘錄歷史記錄
    careTaker.add(memento);

    // 直接生成備忘錄并添加到負(fù)責(zé)人的備忘錄列表
    originator.setState("state3");
    careTaker.add(originator.saveMemento());
    originator.setState("state4");
    careTaker.add(originator.saveMemento());

    System.out.println("發(fā)起人當(dāng)前的狀態(tài): " + originator.getState());

    // 發(fā)起人通過負(fù)責(zé)人那里取出狀態(tài)
    originator.restoreMemento(careTaker.get(0));
    System.out.println("第一個保存的狀態(tài): " + originator.getState());
    originator.restoreMemento(careTaker.get(1));
    System.out.println("第二個保存的狀態(tài): " + originator.getState());

    // 遍歷全部備忘錄
    for (int i = 0; i < careTaker.getMementoList().size(); i++) {
      // 外部一般不直接訪問備忘錄里面的狀態(tài),而是逐個恢復(fù)備忘錄,再取出狀態(tài)來
      originator.restoreMemento(careTaker.get(i));
      System.out.println("state: " + i + ")" + originator.getState());
    }

JavaScript代碼

具體備忘錄

// Memento.js 備忘錄(Memento)角色,負(fù)責(zé)存儲發(fā)起人傳入的狀態(tài)
// 備忘錄(Memento)角色,負(fù)責(zé)存儲發(fā)起人傳入的狀態(tài)
export class Memento {
  constructor(state) {
    console.log(this.constructor.name + '::Memento() [state = ' + state + ']')
    this.state = state
  }

  getState() {
    return this.state
  }

  setState(state) {
    this.state = state
  }
}

發(fā)起人

// Originator.js 發(fā)起人(Originator)負(fù)責(zé)生成狀態(tài)快照,即利用一個新備忘錄對象將自己的內(nèi)部狀態(tài)存儲起來
import { Memento } from './Memento.js'

export class Originator {
  constructor() {
    this.state = undefined
  }

  // 每次創(chuàng)建一個新備忘錄來保存狀態(tài)
  saveMemento() {
    console.log(
      this.constructor.name + '::saveMemento() [state = ' + this.state + ']'
    )
    return new Memento(this.state)
  }

  // 從備忘錄中恢復(fù)狀態(tài)
  restoreMemento(memento) {
    this.state = memento.getState()
  }

  getState() {
    return this.state
  }

  setState(state) {
    this.state = state
  }
}

負(fù)責(zé)人類

// Caretaker.js 負(fù)責(zé)人(Caretaker)角色,只負(fù)責(zé)保存?zhèn)渫浻涗洠荒苄薷膫渫泴ο蟮膬?nèi)容
export class Caretaker {
  constructor() {
    // 備忘錄可以是一個記錄,也可以就是一個對象,根據(jù)業(yè)務(wù)場景設(shè)置
    this.mementoList = []
  }

  add(memento) {
    console.log(
      this.constructor.name +
        '::add() [memento = ' +
        memento.constructor.name +
        ']'
    )
    this.mementoList.push(memento)
  }

  get(index) {
    return this.mementoList[index]
  }

  getMementoList() {
    return this.mementoList
  }
}

測試調(diào)用

import { Originator } from '../src/Originator.js'
import { Caretaker } from '../src/Caretaker.js'

export function test() {
  /*
   * 備忘錄模式是在不暴露對象實(shí)現(xiàn)細(xì)節(jié)的情況下保存和恢復(fù)對象之前的狀態(tài)。
   * 先聲明發(fā)起人Originator,再聲明負(fù)責(zé)人Caretaker,發(fā)起人生成備忘錄Memento
   * 通過負(fù)責(zé)人則保存?zhèn)渫洑v史記錄,讀取備忘錄由負(fù)責(zé)人來完成。
   */
  const originator = new Originator()
  const careTaker = new Caretaker()
  // 發(fā)起人產(chǎn)生一個狀態(tài)
  originator.setState('state1')
  // 覆蓋了狀態(tài),那么前面的狀態(tài)未保存
  originator.setState('state2')
  // 發(fā)起人生成備忘錄,一般添加時直接保存即可
  const memento = originator.saveMemento()
  // 負(fù)責(zé)人保添加備忘錄歷史記錄
  careTaker.add(memento)

  // 直接生成備忘錄并添加到負(fù)責(zé)人的備忘錄列表
  originator.setState('state3')
  careTaker.add(originator.saveMemento())
  originator.setState('state4')
  careTaker.add(originator.saveMemento())

  console.log('發(fā)起人當(dāng)前的狀態(tài): ' + originator.getState())

  // 發(fā)起人通過負(fù)責(zé)人那里取出狀態(tài)
  originator.restoreMemento(careTaker.get(0))
  console.log('第一個保存的狀態(tài): ' + originator.getState())
  originator.restoreMemento(careTaker.get(1))
  console.log('第二個保存的狀態(tài): ' + originator.getState())

  // 遍歷全部備忘錄
  for (let i = 0; i < careTaker.getMementoList().length; i++) {
    // 外部一般不直接訪問備忘錄里面的狀態(tài),而是逐個恢復(fù)備忘錄,再取出狀態(tài)來
    originator.restoreMemento(careTaker.get(i))
    console.log('state: ' + i + ')' + originator.getState())
  }
}

// 執(zhí)行測試
;(function () {
  console.log('test start:')
  test()
})()

更多語言版本

不同語言實(shí)現(xiàn)設(shè)計模式:https://github.com/microwind/design-pattern文章來源地址http://www.zghlxwxcb.cn/news/detail-419257.html

到了這里,關(guān)于【備忘錄設(shè)計模式詳解】C/Java/JS/Go/Python/TS不同語言實(shí)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【設(shè)計模式——學(xué)習(xí)筆記】23種設(shè)計模式——備忘錄模式Memento(原理講解+應(yīng)用場景介紹+案例介紹+Java代碼實(shí)現(xiàn))

    【設(shè)計模式——學(xué)習(xí)筆記】23種設(shè)計模式——備忘錄模式Memento(原理講解+應(yīng)用場景介紹+案例介紹+Java代碼實(shí)現(xiàn))

    游戲角色有攻擊力和防御力,在大戰(zhàn)Boss前保存自身的狀態(tài)(攻擊力和防御力),當(dāng)大戰(zhàn)Boss后攻擊力和防御力下降,可以從備忘錄對象恢復(fù)到大戰(zhàn)前的狀態(tài) 針對每一種角色,設(shè)計一個類來存儲該角色的狀態(tài) 【分析】 一個對象,就對應(yīng)一個保存對象狀態(tài)的對象, 這樣當(dāng)我們游戲

    2024年02月13日
    瀏覽(57)
  • 設(shè)計模式——備忘錄模式

    備忘錄模式(Memento Pattern)是一種行為型設(shè)計模式,它在不破壞封裝的前提下,捕獲一個對象的內(nèi)部狀態(tài),并在該對象之外保存這個狀態(tài)。這樣可以在需要時將對象恢復(fù)到先前的狀態(tài)。 發(fā)起人(Originator): 是擁有復(fù)雜內(nèi)部狀態(tài)的對象,它可以創(chuàng)建和恢復(fù)備忘錄。 備忘錄(M

    2024年01月19日
    瀏覽(26)
  • 《設(shè)計模式》備忘錄模式

    《設(shè)計模式》備忘錄模式

    定義 : 備忘錄模式又稱為快照模式或者令牌模式, 在不破壞封裝性的前提下,捕獲一個對象的內(nèi)部狀態(tài),并在該對象之外保存這個狀態(tài),這樣可以在以后將對象恢復(fù)到原先保存的狀態(tài)。 屬性 行為型 模式。 備忘錄模式的角色組成 : Originator(發(fā)起人) :負(fù)責(zé)創(chuàng)建一個 Memento

    2024年02月06日
    瀏覽(32)
  • 【設(shè)計模式】備忘錄模式

    【設(shè)計模式】備忘錄模式

    主頁傳送門: ?? 傳送 ???????備忘錄(Memento Pattern)模式又叫做快照模式(Snapshot Pattern)或Token模式,是對象的行為模式。。其定義如下: Without violating encapsulation,capture and externalize an object’s internal state so that the object can be restored to this state later. ???????即:在不破壞封

    2024年02月07日
    瀏覽(25)
  • 設(shè)計模式-備忘錄模式

    設(shè)計模式-備忘錄模式

    備忘錄模式(Memento Pattern)是計算機(jī)科學(xué)中的一種行為設(shè)計模式。它提供了一種在不破壞封裝性的前提下,捕獲和恢復(fù)對象內(nèi)部狀態(tài)的方法。這種模式主要用于在用戶需要回滾到對象的某個先前狀態(tài)時,能夠?qū)崿F(xiàn)狀態(tài)的還原。 在備忘錄模式中,主要涉及到三個角色: Origina

    2024年01月23日
    瀏覽(23)
  • 【前端設(shè)計模式】之備忘錄模式

    【前端設(shè)計模式】之備忘錄模式

    設(shè)計模式是在軟件開發(fā)中經(jīng)過驗(yàn)證的解決問題的方法。它們是從經(jīng)驗(yàn)中總結(jié)出來的,可以幫助我們更好地組織和管理代碼,提高代碼的可維護(hù)性、可擴(kuò)展性和可重用性。無論是前端還是后端開發(fā),設(shè)計模式都扮演著重要的角色。在本專欄中,我們將探索一些常見的前端設(shè)計模

    2024年02月05日
    瀏覽(30)
  • 設(shè)計模式行為型——備忘錄模式

    設(shè)計模式行為型——備忘錄模式

    目錄 備忘錄模式的定義 備忘錄模式的實(shí)現(xiàn) 備忘錄模式角色 備忘錄模式類圖 備忘錄模式舉例 備忘錄模式代碼實(shí)現(xiàn) 備忘錄模式的特點(diǎn) 優(yōu)點(diǎn) 缺點(diǎn) 使用場景 注意事項(xiàng) 實(shí)際應(yīng)用 ????????備忘錄模式(Memento Pattern)又叫做快照模式(Snapshot Pattern)或Token模式(Token Pattern),屬

    2024年02月14日
    瀏覽(23)
  • 設(shè)計模式(十八)備忘錄

    設(shè)計模式(十八)備忘錄

    在不破壞封裝的前提下,捕獲一個對象的內(nèi)部狀態(tài),并在該對象之外保存這個狀態(tài),這樣就可以在以后將對象恢復(fù)到原先保存的狀態(tài)。備忘錄模式是一種對象行為型模式,其別名為標(biāo)記(Token)模式。 備忘錄模式的核心在于備忘錄類以及用于管理備忘錄的負(fù)責(zé)人類的設(shè)計,包

    2024年02月04日
    瀏覽(24)
  • 《設(shè)計模式的藝術(shù)》筆記 - 備忘錄模式

    ? ? ? ? 備忘錄模式在不破壞封裝的前提下,捕獲一個對象的內(nèi)部狀態(tài),并在該對象之外保存這個狀態(tài),這樣可以在以后將對象恢復(fù)到原先保存的狀態(tài)。它是一種對象行為模式,別名為Token。 myclass.h myclass.cpp main.cpp ? ? ? ? 1.?它提供了一種狀態(tài)恢復(fù)的實(shí)現(xiàn)機(jī)制,使得用戶可

    2024年01月24日
    瀏覽(21)
  • C++ 設(shè)計模式之備忘錄模式

    C++ 設(shè)計模式之備忘錄模式

    【聲明】本題目來源于卡碼網(wǎng)(題目頁面 (kamacoder.com)) 【提示:如果不想看文字介紹,可以直接跳轉(zhuǎn)到C++編碼部分】 ? ? ? ? -- 什么是備忘錄模式? (第17種模式) ???????? 備忘錄模式 (Memento Pattern)是?種 ?為型設(shè)計模式 ,它允許在不暴露對象實(shí)現(xiàn)的情況下捕獲對

    2024年01月20日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包