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

深入理解Java設(shè)計模式之備忘錄模式

 更新時間:2021年11月05日 15:11:01   作者:一指流砂~  
這篇文章主要介紹了JAVA設(shè)計模式之備忘錄模式的的相關(guān)資料,文中示例代碼非常詳細(xì),供大家參考和學(xué)習(xí),感興趣的朋友可以了解

一、什么是備忘錄模式

定義:在不破壞封閉的前提下,捕獲一個對象的內(nèi)部狀態(tài),并在該對象之外保存這個狀態(tài)。這樣以后就可將該對象恢復(fù)到原先保存的狀態(tài)。

該模式用于保存對象當(dāng)前狀態(tài),并且在之后可以再次恢復(fù)到此狀態(tài)。備忘錄模式實現(xiàn)的方式需要保證被保存的對象狀態(tài)不能被對象從外部訪問,

目的是為了保護被保存的這些對象狀態(tài)的完整性以及內(nèi)部實現(xiàn)不向外暴露

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

涉及角色:

1.Originator(發(fā)起人):負(fù)責(zé)創(chuàng)建一個備忘錄Memento,用以記錄當(dāng)前時刻自身的內(nèi)部狀態(tài),并可使用備忘錄恢復(fù)內(nèi)部狀態(tài)。Originator可以根據(jù)需要決定Memento存儲自己的哪些內(nèi)部狀態(tài)。

2.Memento(備忘錄):負(fù)責(zé)存儲Originator對象的內(nèi)部狀態(tài),并可以防止Originator以外的其他對象訪問備忘錄。備忘錄有兩個接口:Caretaker只能看到備忘錄的窄接口,他只能將備忘錄傳遞給其他對象。Originator卻可看到備忘錄的寬接口,允許它訪問返回到先前狀態(tài)所需要的所有數(shù)據(jù)。

3.Caretaker(管理者):負(fù)責(zé)備忘錄Memento,不能對Memento的內(nèi)容進行訪問或者操作。

三、備忘錄模式的使用場景

1.需要保存和恢復(fù)數(shù)據(jù)的相關(guān)狀態(tài)場景。

2.提供一個可回滾(rollback)的操作。

3.數(shù)據(jù)庫連接的事務(wù)管理就是用的備忘錄模式。

四、備忘錄模式的優(yōu)缺點

優(yōu)點:

1、有時一些發(fā)起人對象的內(nèi)部信息必須保存在發(fā)起人對象以外的地方,但是必須要由發(fā)起人對象自己讀取,這時,使用備忘錄模式可以把復(fù)雜的發(fā)起人內(nèi)部信息對其他的對象屏蔽起來,從而可以恰當(dāng)?shù)乇3址庋b的邊界。

2、本模式簡化了發(fā)起人類。發(fā)起人不再需要管理和保存其內(nèi)部狀態(tài)的一個個版本,客戶端可以自行管理他們所需要的這些狀態(tài)的版本。

3、當(dāng)發(fā)起人角色的狀態(tài)改變的時候,有可能這個狀態(tài)無效,這時候就可以使用暫時存儲起來的備忘錄將狀態(tài)復(fù)原。

缺點:

1、如果發(fā)起人角色的狀態(tài)需要完整地存儲到備忘錄對象中,那么在資源消耗上面?zhèn)渫泴ο髸馨嘿F。

2、當(dāng)負(fù)責(zé)人角色將一個備忘錄 存儲起來的時候,負(fù)責(zé)人可能并不知道這個狀態(tài)會占用多大的存儲空間,從而無法提醒用戶一個操作是否很昂貴。

3、當(dāng)發(fā)起人角色的狀態(tài)改變的時候,有可能這個協(xié)議無效。如果狀態(tài)改變的成功率不高的話,不如采取“假如”協(xié)議模式。

五、備忘錄模式的實現(xiàn)

實例:備份電話本

聯(lián)系人--需要備份的數(shù)據(jù),是狀態(tài)數(shù)據(jù),沒有操作

public sealed class ContactPerson
{
    //姓名
    public string Name { get; set; }
    //電話號碼
    public string MobileNumber { get; set; }
}

發(fā)起人--相當(dāng)于【發(fā)起人角色】Originator

public sealed class MobileBackOriginator
{
    // 發(fā)起人需要保存的內(nèi)部狀態(tài)
    private List<ContactPerson> _personList;

    public List<ContactPerson> ContactPersonList
    {
        get
        {
            return this._personList;
        }
        set
        {
            this._personList = value;
        }
    }
    //初始化需要備份的電話名單
    public MobileBackOriginator(List<ContactPerson> personList)
    {
        if (personList != null)
        {
            this._personList = personList;
        }
        else
        {
            throw new ArgumentNullException("參數(shù)不能為空!");
        }
    }
    // 創(chuàng)建備忘錄對象實例,將當(dāng)期要保存的聯(lián)系人列表保存到備忘錄對象中
    public ContactPersonMemento CreateMemento()
    {
        return new ContactPersonMemento(new List<ContactPerson>(this._personList));
    }
    // 將備忘錄中的數(shù)據(jù)備份還原到聯(lián)系人列表中
    public void RestoreMemento(ContactPersonMemento memento)
    {
        this.ContactPersonList = memento.ContactPersonListBack;
    }
    public void Show()
    {
        Console.WriteLine("聯(lián)系人列表中共有{0}個人,他們是:", ContactPersonList.Count);
        foreach (ContactPerson p in ContactPersonList)
        {
            Console.WriteLine("姓名: {0} 號碼: {1}", p.Name, p.MobileNumber);
        }
    }
}

備忘錄對象,用于保存狀態(tài)數(shù)據(jù),保存的是當(dāng)時對象具體狀態(tài)數(shù)據(jù)--相當(dāng)于【備忘錄角色】Memeto

public sealed class ContactPersonMemento
{
    // 保存發(fā)起人創(chuàng)建的電話名單數(shù)據(jù),就是所謂的狀態(tài)
    public List<ContactPerson> ContactPersonListBack { get; private set; }
    public ContactPersonMemento(List<ContactPerson> personList)
    {
        ContactPersonListBack = personList;
    }
}

管理角色,它可以管理【備忘錄】對象,如果是保存多個【備忘錄】對象,當(dāng)然可以對保存的對象進行增、刪等管理處理---相當(dāng)于【管理者角色】Caretaker

public sealed class MementoManager
{
    //如果想保存多個【備忘錄】對象,可以通過字典或者堆棧來保存,堆棧對象可以反映保存對象的先后順序
    //比如:public Dictionary<string, ContactPersonMemento> ContactPersonMementoDictionary { get; set; }
    public ContactPersonMemento ContactPersonMemento { get; set; }
}

客戶端代碼

class Program
{
    static void Main(string[] args)
    {
        List<ContactPerson> persons = new List<ContactPerson>()
            {
                new ContactPerson() { Name="黃飛鴻", MobileNumber = "13533332222"},
                new ContactPerson() { Name="方世玉", MobileNumber = "13966554433"},
                new ContactPerson() { Name="洪熙官", MobileNumber = "13198765544"}
            };
        //手機名單發(fā)起人
        MobileBackOriginator mobileOriginator = new MobileBackOriginator(persons);
        mobileOriginator.Show();
        // 創(chuàng)建備忘錄并保存?zhèn)渫泴ο?
        MementoManager manager = new MementoManager();
        manager.ContactPersonMemento = mobileOriginator.CreateMemento();
        // 更改發(fā)起人聯(lián)系人列表
        Console.WriteLine("----移除最后一個聯(lián)系人--------");
        mobileOriginator.ContactPersonList.RemoveAt(2);
        mobileOriginator.Show();
        // 恢復(fù)到原始狀態(tài)
        Console.WriteLine("-------恢復(fù)聯(lián)系人列表------");
        mobileOriginator.RestoreMemento(manager.ContactPersonMemento);
        mobileOriginator.Show();
        Console.Read();
    }
}

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之際的更多內(nèi)容!

相關(guān)文章

  • Java中的SecretKeyFactory類使用詳解

    Java中的SecretKeyFactory類使用詳解

    這篇文章主要介紹了Java中的SecretKeyFactory類使用詳解,SecretKeyFactory表示私密密鑰的工廠,密鑰工廠用來將密鑰(類型 Key 的不透明加密密鑰)轉(zhuǎn)換為密鑰規(guī)范(底層密鑰材料的透明表示形式),需要的朋友可以參考下
    2024-01-01
  • 解析java中的condition

    解析java中的condition

    Condition 將 Object 監(jiān)視器方法(wait()、notify()和notifyAll())分解成截然不同的對象,以便通過將這些對象與任意Lock實現(xiàn)組合使用,為每個對象提供多個等待 set(wait-set)
    2021-06-06
  • springboot執(zhí)行延時任務(wù)之DelayQueue實例

    springboot執(zhí)行延時任務(wù)之DelayQueue實例

    這篇文章主要介紹了springboot執(zhí)行延時任務(wù)之DelayQueue實例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 分布式框架Zookeeper?api的使用介紹

    分布式框架Zookeeper?api的使用介紹

    Zookeeper作為?個分布式框架,主要用來解決分布式?致性問題,它提供了簡單的分布式原語,并且對多種編程語?提供了API,所以接下來重點來看下Zookeeper的java客戶端API使用方式
    2022-09-09
  • Java遞歸如何正確輸出樹形菜單

    Java遞歸如何正確輸出樹形菜單

    這篇文章主要為大家詳細(xì)介紹了Java遞歸如何正確輸出樹形菜單,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • 使用Spring Initializr方式如何快速構(gòu)建Spring Boot項目

    使用Spring Initializr方式如何快速構(gòu)建Spring Boot項目

    Spring lnitializr是一個Web應(yīng)用,它提供了一個基本的項目結(jié)構(gòu),能夠幫助我們快速構(gòu)建一個基礎(chǔ)的Spring Boot項目,本文分步驟講解如何使用Spring Initializr方式構(gòu)建Spring Boot項目,感興趣的朋友跟隨小編一起看看吧
    2023-08-08
  • Java實現(xiàn)批量修改txt文件名稱的方法示例

    Java實現(xiàn)批量修改txt文件名稱的方法示例

    這篇文章主要介紹了Java實現(xiàn)批量修改txt文件名稱的方法,結(jié)合實例形式分析了Java針對目錄文件遍歷及文件讀寫、屬性操作等相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2019-03-03
  • 深入理解JVM垃圾回收算法

    深入理解JVM垃圾回收算法

    我們都知道java語言與C語言最大的區(qū)別就是內(nèi)存自動回收,那么JVM是怎么控制內(nèi)存回收的,這篇文章將介紹JVM垃圾回收的幾種算法,從而了解內(nèi)存回收的基本原理
    2021-06-06
  • SpringBoot?+DynamicDataSource切換多數(shù)據(jù)源的全過程

    SpringBoot?+DynamicDataSource切換多數(shù)據(jù)源的全過程

    這篇文章主要介紹了SpringBoot?+DynamicDataSource切換多數(shù)據(jù)源的全過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java序列化的原理分析及解決

    Java序列化的原理分析及解決

    文章介紹了Java中的序列化機制,包括Serializable和Externalizable接口的區(qū)別,以及serialVersionUID的作用,Serializable接口可以序列化的所有子類型本身都是可序列化的,如果要序列化的類有父類,父類也應(yīng)該實現(xiàn)Serializable接口
    2024-11-11

最新評論

峨边| 新密市| 武平县| 邓州市| 永济市| 广汉市| 平度市| 大同市| 盖州市| 汉寿县| 台州市| 长沙县| 双柏县| 定襄县| 白山市| 巨野县| 水富县| 乌鲁木齐县| 大丰市| 舟山市| 永济市| 左贡县| 宜宾市| 洞头县| 图木舒克市| 乌什县| 文成县| 安顺市| 靖江市| 咸阳市| 平度市| 南陵县| 新宾| 牡丹江市| 元谋县| 航空| 罗江县| 阿瓦提县| 三都| 峨边| 天峨县|