最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java設(shè)計(jì)模式之備忘錄模式使用詳解

 更新時(shí)間:2024年02月11日 10:07:26   作者:程序猿進(jìn)階  
這篇文章主要介紹了Java設(shè)計(jì)模式中備忘錄模式的使用,備忘錄設(shè)計(jì)模式也叫作快照模式,主要用于實(shí)現(xiàn)防丟失、撤銷、恢復(fù)等功能,本文將通過(guò)示例為大家講解備忘錄模式的定義與使用,需要的同學(xué)可以參考一下

前言

備忘錄模式(Memento Pattern): 保存對(duì)象的某個(gè)狀態(tài),以便在未來(lái)需要的時(shí)候進(jìn)行數(shù)據(jù)的恢復(fù)。相當(dāng)容易理解,舉個(gè)簡(jiǎn)單的例子:Word 軟件在編輯時(shí)按 Ctrl+Z 組合鍵時(shí)能撤銷當(dāng)前操作,使文檔恢復(fù)到之前的狀態(tài);

一、備忘錄模式的基本介紹

【1】備忘錄模式(Memento Pattern): 在不破壞封裝性的前提下,捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài),并在該對(duì)象之外保存這個(gè)狀態(tài)。這樣以后就可將該對(duì)象恢復(fù)到原先保存的狀態(tài)。

【2】現(xiàn)實(shí)生活中備忘錄是用來(lái)記錄某些要去做的事情,或者是記錄已經(jīng)達(dá)成共同意見的事情,以防忘記。而在軟件層面,備忘錄模式有著相同的含義,備忘錄對(duì)象主要用來(lái)記錄一個(gè)對(duì)象的某種狀態(tài),或者某些數(shù)據(jù),當(dāng)要做回退時(shí),可以從備忘錄對(duì)象里獲取原來(lái)的數(shù)據(jù)進(jìn)行恢復(fù)操作。

【3】備忘錄模式屬于行為型模式。

【4】實(shí)現(xiàn)了信息的封裝,使得用戶不需要關(guān)心狀態(tài)和保存細(xì)節(jié)。符合 “單一職責(zé)原則” 。

【5】為了節(jié)約內(nèi)存,備忘錄模式可以和原型模式配合使用。

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

忘錄模式的核心是設(shè)計(jì)備忘錄類以及用于管理備忘錄的管理者類,備忘錄模式的主要角色如下:

【1】發(fā)起人(Originator)角色: 記錄當(dāng)前對(duì)象的內(nèi)部狀態(tài)信息,提供創(chuàng)建備忘錄和恢復(fù)備忘錄數(shù)據(jù)的功能,實(shí)現(xiàn)其他業(yè)務(wù)功能,它可以訪問(wèn)備忘錄里的所有信息。

【2】備忘錄(Memetor)角色: 負(fù)責(zé)存儲(chǔ)發(fā)起人對(duì)象的內(nèi)部狀態(tài),在需要的時(shí)候提供這些內(nèi)部狀態(tài)給發(fā)起人。

【3】管理者(Caretaker)角色: 對(duì)備忘錄進(jìn)行管理,提供保存與獲取備忘錄的功能,但其不能對(duì)備忘錄的內(nèi)容進(jìn)行訪問(wèn)與修改。

三、備忘錄模式案例分析

我們使用備忘錄模式寫一個(gè)學(xué)校 100 米考試的案例:5 人一組,進(jìn)行分組測(cè)試。我們需要備份的對(duì)象是,一組學(xué)生的成績(jī)。

【1】發(fā)起人(Originator)角色: 發(fā)起人需要依賴備忘錄類,對(duì)自己每次記錄的成績(jī)進(jìn)行備份 createMemento 。同時(shí)需要提供一個(gè)還原方法 getOriginalFromMemento 將需要的備份類作為參數(shù)傳遞進(jìn)來(lái),并將結(jié)果賦值給目標(biāo)類。

//100 米 測(cè)試  5人一組 ,這是個(gè)人所花費(fèi)的時(shí)間,我們使用備忘錄的方式實(shí)現(xiàn)一下。
public class Original {
    //姓名
    private String name;
    //時(shí)間
    private int timestamp;
    public Memento createMemento() {
        return new Memento(name, timestamp);
    }
    //獲取目標(biāo)對(duì)象  通過(guò)排名
    public void getOriginalFromMemento(Memento memento) {
        name = memento.getName();
        timestamp = memento.getTimestamp();
    }
    public int getTimestamp() {
        return timestamp;
    }
    public void setTimestamp(int timestamp) {
        this.timestamp = timestamp;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "Original [name=" + name + ", timestamp=" + timestamp + "]";
    }
}

【2】備忘錄(Memetor)角色: 提供一些目標(biāo)對(duì)象需要備份的屬性,通過(guò)構(gòu)造器進(jìn)行屬性傳遞。

public class Memento {
    //姓名
    private String name;
    //時(shí)間
    private int timestamp;
    //構(gòu)造器
    public Memento(String name, int timestamp) {
        super();
        this.name = name;
        this.timestamp = timestamp;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getTimestamp() {
        return timestamp;
    }
    public void setTimestamp(int timestamp) {
        this.timestamp = timestamp;
    }
}

【3】管理者(Caretaker)角色: 創(chuàng)建一個(gè)存儲(chǔ)備忘錄對(duì)象的集合 <Map、List、Set> 等,同時(shí)創(chuàng)建添加、獲取、清空等方法。

public class Caretaker {
    //排名
    private int index = 1;
    //用于順序存儲(chǔ) 參加測(cè)試的 十名同學(xué)的成績(jī)
    Map<Integer, Memento>  mementos = new HashMap<Integer, Memento>();
    //提供一個(gè) add 方法
    public void add(Memento m) {
        mementos.put(index, m);
        index += 1;
    }
    //獲取備份類
    public Memento get(int key) {
        return mementos.get(key);
    }
    //歸位
    public void remove() {
        mementos.clear();
    }
}

【4】客戶端(Client)角色: 首先將順序按的前五名同學(xué)的成績(jī)及姓名,通過(guò)集合 Map 按照名次存儲(chǔ)。五名同學(xué)測(cè)試完成后,通過(guò)目標(biāo)類的 getOriginalFromMemento 方法,根據(jù)名次獲取同學(xué)的成績(jī),并記錄在成績(jī)花名冊(cè)中。最后,清空記錄下一組。

public class Client {
    public static void main(String[] args) {
        //創(chuàng)建 目標(biāo)類
        Original original = new Original();
        //管理類
        Caretaker managerMemento = new Caretaker();
        //記錄成績(jī)
        recordResults(original,managerMemento);
        //獲取第一名的成績(jī)
        System.out.println("恢復(fù)前目標(biāo)類的記錄值"+original.toString());
        //從集合中獲取第一名的值
        Memento memento1 = managerMemento.get(1);
        //調(diào)用目標(biāo)類的還原方法
        original.getOriginalFromMemento(memento1);
        System.out.println("恢復(fù)第一名的成績(jī)信息:"+original.toString());
        //從集合中獲取第三名的值
        Memento memento3 = managerMemento.get(3);
        //調(diào)用目標(biāo)類的還原方法
        original.getOriginalFromMemento(memento3);
        System.out.println("恢復(fù)第三名的成績(jī)信息:"+original.toString());
        //清空記錄下一組
        managerMemento.remove();
    }
    private static void recordResults(Original original,Caretaker managerMemento) {
        //第一名學(xué)生成績(jī)
        original.setName("張三");
        original.setTimestamp(2330);
        //創(chuàng)建一個(gè)備份類
        Memento memento1 = original.createMemento();
        //備份類存入 管理類中
        managerMemento.add(memento1);
        //第二名學(xué)生成績(jī)
        original.setName("李四");
        original.setTimestamp(2550);
        //創(chuàng)建一個(gè)備份類
        Memento memento2 = original.createMemento();
        //備份類存入 管理類中
        managerMemento.add(memento2);
        //第三名學(xué)生成績(jī)
        original.setName("王五");
        original.setTimestamp(2560);
        //創(chuàng)建一個(gè)備份類
        Memento memento3 = original.createMemento();
        //備份類存入 管理類中
        managerMemento.add(memento3);
    }
}

【5】結(jié)果展示: 備份者模式思想相對(duì)簡(jiǎn)單,主要查看細(xì)節(jié)上的實(shí)現(xiàn)。備份類相對(duì)簡(jiǎn)單,就一個(gè)普通類。但是目標(biāo)類,提供了存儲(chǔ)原始對(duì)象和獲取原始對(duì)象的方法,是備份者模式的精華所在。

恢復(fù)目標(biāo)類的記錄值Original [name=王五, timestamp=2560]
恢復(fù)第一名的成績(jī)信息:Original [name=張三, timestamp=2330]
恢復(fù)第三名的成績(jī)信息:Original [name=王五, timestamp=2560]

到此這篇關(guān)于Java設(shè)計(jì)模式之備忘錄模式使用詳解的文章就介紹到這了,更多相關(guān)Java備忘錄模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java并發(fā)控制機(jī)制詳解

    Java并發(fā)控制機(jī)制詳解

    這篇文章主要為大家詳細(xì)介紹了Java并發(fā)控制機(jī)制,什么是Java并發(fā)控制機(jī)制,Java并發(fā)控制機(jī)制的作用,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Spring系列之事物管理

    Spring系列之事物管理

    這篇文章主要介紹了Spring系列之事物管理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用spring方面知識(shí)具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們一起學(xué)習(xí)學(xué)習(xí)吧
    2021-09-09
  • SpringSecurity登錄使用JSON格式數(shù)據(jù)的方法

    SpringSecurity登錄使用JSON格式數(shù)據(jù)的方法

    這篇文章主要介紹了SpringSecurity登錄使用JSON格式數(shù)據(jù)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • SpringMVC Hibernate與JPA使用教程

    SpringMVC Hibernate與JPA使用教程

    這篇文章主要介紹了SpringMVC Hibernate與JPA,在正式進(jìn)入Hibernate的高級(jí)應(yīng)用之前,需要了解聲明是數(shù)據(jù)模型與領(lǐng)域模型,這兩個(gè)概念將會(huì)幫助我們更好的理解實(shí)體對(duì)象的關(guān)聯(lián)關(guān)系映射
    2022-12-12
  • 深入理解@component與@Configuration注解

    深入理解@component與@Configuration注解

    這篇文章主要介紹了深入理解@component與@Configuration注解,從Spring3.0,@Configuration用于定義配置類,可替換xml配置文件,被注解的類內(nèi)部包含有一個(gè)或多個(gè)被@Bean注解的方法,這些方法將會(huì)被掃描,并用于構(gòu)建bean定義,初始化Spring容器,需要的朋友可以參考下
    2023-11-11
  • SpringCloud微服務(wù)架構(gòu)實(shí)戰(zhàn)之微服務(wù)治理功能的實(shí)現(xiàn)

    SpringCloud微服務(wù)架構(gòu)實(shí)戰(zhàn)之微服務(wù)治理功能的實(shí)現(xiàn)

    這篇文章主要介紹了SpringCloud微服務(wù)架構(gòu)實(shí)戰(zhàn)之微服務(wù)治理,這些治理工具主要包括服務(wù)的注冊(cè)與發(fā)現(xiàn)、負(fù)載均衡管理、動(dòng)態(tài)路由、服務(wù)降級(jí)和故障轉(zhuǎn)移、鏈路跟蹤、服務(wù)監(jiān)控等,需要的朋友可以參考下
    2022-02-02
  • SpringBoot如何使用過(guò)濾器進(jìn)行XSS防御

    SpringBoot如何使用過(guò)濾器進(jìn)行XSS防御

    想對(duì)全局的請(qǐng)求都進(jìn)行XSS防御可以使用servlet中的過(guò)濾器或者spring mvc中的攔截器,下面我們就來(lái)看看如何使用servlet中的過(guò)濾器進(jìn)行XSS防御吧
    2024-11-11
  • 從配置到監(jiān)控詳解SpringBoot微服務(wù)性能優(yōu)化實(shí)踐指南

    從配置到監(jiān)控詳解SpringBoot微服務(wù)性能優(yōu)化實(shí)踐指南

    Spring Boot憑借快速開發(fā)、自動(dòng)化配置和豐富生態(tài),被廣泛用于構(gòu)建微服務(wù),本指南將聚焦Spring Boot微服務(wù)性能優(yōu)化,希望可以幫助大家掌握性能調(diào)優(yōu)要點(diǎn)
    2025-08-08
  • springcloud微服務(wù)之Eureka配置詳解

    springcloud微服務(wù)之Eureka配置詳解

    這篇文章主要介紹了springcloud微服務(wù)之Eureka配置詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Java判斷字符串是否是整數(shù)或者浮點(diǎn)數(shù)的方法

    Java判斷字符串是否是整數(shù)或者浮點(diǎn)數(shù)的方法

    今天小編就為大家分享一篇Java判斷字符串是否是整數(shù)或者浮點(diǎn)數(shù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07

最新評(píng)論

上蔡县| 通道| 双峰县| 连城县| 唐河县| 通海县| 安溪县| 西畴县| 隆子县| 皋兰县| 怀来县| 通辽市| 台东县| 玉门市| 铜梁县| 栖霞市| 盖州市| 中宁县| 琼海市| 砀山县| 屏南县| 华宁县| 逊克县| 海淀区| 昂仁县| 伊春市| 石泉县| 青州市| 沙坪坝区| 新兴县| 舒兰市| 佛坪县| 吉安县| 吴桥县| 和政县| 武城县| 丰宁| 济宁市| 水富县| 运城市| 恩平市|