您好,登錄后才能下訂單哦!
本篇文章為大家展示了怎樣深入理解Java設計模式的備忘錄模式,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
定義:在不破壞封閉的前提下,捕獲一個對象的內部狀態,并在該對象之外保存這個狀態。這樣以后就可將該對象恢復到原先保存的狀態。
該模式用于保存對象當前狀態,并且在之后可以再次恢復到此狀態。備忘錄模式實現的方式需要保證被保存的對象狀態不能被對象從外部訪問,
目的是為了保護被保存的這些對象狀態的完整性以及內部實現不向外暴露
涉及角色:
1.Originator
(發起人):負責創建一個備忘錄Memento,用以記錄當前時刻自身的內部狀態,并可使用備忘錄恢復內部狀態。Originator可以根據需要決定Memento存儲自己的哪些內部狀態。
2.Memento
(備忘錄):負責存儲Originator對象的內部狀態,并可以防止Originator以外的其他對象訪問備忘錄。備忘錄有兩個接口:Caretaker只能看到備忘錄的窄接口,他只能將備忘錄傳遞給其他對象。Originator卻可看到備忘錄的寬接口,允許它訪問返回到先前狀態所需要的所有數據。
3.Caretaker
(管理者):負責備忘錄Memento,不能對Memento的內容進行訪問或者操作。
1.需要保存和恢復數據的相關狀態場景。
2.提供一個可回滾(rollback)的操作。
3.數據庫連接的事務管理就是用的備忘錄模式。
優點:
1、有時一些發起人對象的內部信息必須保存在發起人對象以外的地方,但是必須要由發起人對象自己讀取,這時,使用備忘錄模式可以把復雜的發起人內部信息對其他的對象屏蔽起來,從而可以恰當地保持封裝的邊界。
2、本模式簡化了發起人類。發起人不再需要管理和保存其內部狀態的一個個版本,客戶端可以自行管理他們所需要的這些狀態的版本。
3、當發起人角色的狀態改變的時候,有可能這個狀態無效,這時候就可以使用暫時存儲起來的備忘錄將狀態復原。
缺點:
1、如果發起人角色的狀態需要完整地存儲到備忘錄對象中,那么在資源消耗上面備忘錄對象會很昂貴。
2、當負責人角色將一個備忘錄 存儲起來的時候,負責人可能并不知道這個狀態會占用多大的存儲空間,從而無法提醒用戶一個操作是否很昂貴。
3、當發起人角色的狀態改變的時候,有可能這個協議無效。如果狀態改變的成功率不高的話,不如采取“假如”協議模式。
實例:備份電話本
聯系人--需要備份的數據,是狀態數據,沒有操作
public sealed class ContactPerson { //姓名 public string Name { get; set; } //電話號碼 public string MobileNumber { get; set; } }
發起人--相當于【發起人角色】Originator
public sealed class MobileBackOriginator { // 發起人需要保存的內部狀態 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("參數不能為空!"); } } // 創建備忘錄對象實例,將當期要保存的聯系人列表保存到備忘錄對象中 public ContactPersonMemento CreateMemento() { return new ContactPersonMemento(new List<ContactPerson>(this._personList)); } // 將備忘錄中的數據備份還原到聯系人列表中 public void RestoreMemento(ContactPersonMemento memento) { this.ContactPersonList = memento.ContactPersonListBack; } public void Show() { Console.WriteLine("聯系人列表中共有{0}個人,他們是:", ContactPersonList.Count); foreach (ContactPerson p in ContactPersonList) { Console.WriteLine("姓名: {0} 號碼: {1}", p.Name, p.MobileNumber); } } }
備忘錄對象,用于保存狀態數據,保存的是當時對象具體狀態數據--相當于【備忘錄角色】Memeto
public sealed class ContactPersonMemento { // 保存發起人創建的電話名單數據,就是所謂的狀態 public List<ContactPerson> ContactPersonListBack { get; private set; } public ContactPersonMemento(List<ContactPerson> personList) { ContactPersonListBack = personList; } }
管理角色,它可以管理【備忘錄】對象,如果是保存多個【備忘錄】對象,當然可以對保存的對象進行增、刪等管理處理---相當于【管理者角色】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"} }; //手機名單發起人 MobileBackOriginator mobileOriginator = new MobileBackOriginator(persons); mobileOriginator.Show(); // 創建備忘錄并保存備忘錄對象 MementoManager manager = new MementoManager(); manager.ContactPersonMemento = mobileOriginator.CreateMemento(); // 更改發起人聯系人列表 Console.WriteLine("----移除最后一個聯系人--------"); mobileOriginator.ContactPersonList.RemoveAt(2); mobileOriginator.Show(); // 恢復到原始狀態 Console.WriteLine("-------恢復聯系人列表------"); mobileOriginator.RestoreMemento(manager.ContactPersonMemento); mobileOriginator.Show(); Console.Read(); } }
上述內容就是怎樣深入理解Java設計模式的備忘錄模式,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。