<del id="d4fwx"><form id="d4fwx"></form></del>
      <del id="d4fwx"><form id="d4fwx"></form></del><del id="d4fwx"><form id="d4fwx"></form></del>

            <code id="d4fwx"><abbr id="d4fwx"></abbr></code>
          • java中備忘錄模式的示例分析-創(chuàng)新互聯(lián)

            這篇文章給大家分享的是有關java中備忘錄模式的示例分析的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

            專注于為中小企業(yè)提供成都做網站、網站設計服務,電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)安次免費做網站提供優(yōu)質的服務。我們立足成都,凝聚了一批互聯(lián)網行業(yè)人才,有力地推動了上1000+企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網站建設實現規(guī)模擴充和轉變。

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

            類型:行為類

            類圖:

            java中備忘錄模式的示例分析

            我們在編程的時候,經常需要保存對象的中間狀態(tài),當需要的時候,可以恢復到這個狀態(tài)。比如,我們使用Eclipse進行編程時,假如編寫失誤(例如不小心誤刪除了幾行代碼),我們希望返回刪除前的狀態(tài),便可以使用Ctrl+Z來進行返回。這時我們便可以使用備忘錄模式來實現。

            備忘錄模式的結構

            發(fā)起人:記錄當前時刻的內部狀態(tài),負責定義哪些屬于備份范圍的狀態(tài),負責創(chuàng)建和恢復備忘錄數據。
            備忘錄:負責存儲發(fā)起人對象的內部狀態(tài),在需要的時候提供發(fā)起人需要的內部狀態(tài)。
            管理角色:對備忘錄進行管理,保存和提供備忘錄。

            通用代碼實現

            class Originator { 
                private String state = ""; 
                 
                public String getState() { 
                  return state; 
                } 
                public void setState(String state) { 
                  this.state = state; 
                } 
                public Memento createMemento(){ 
                  return new Memento(this.state); 
                } 
                public void restoreMemento(Memento memento){ 
                  this.setState(memento.getState()); 
                } 
              } 
               
              class Memento { 
                private String state = ""; 
                public Memento(String state){ 
                  this.state = state; 
                } 
                public String getState() { 
                  return state; 
                } 
                public void setState(String state) { 
                  this.state = state; 
                } 
              } 
              class Caretaker { 
                private Memento memento; 
                public Memento getMemento(){ 
                  return memento; 
                } 
                public void setMemento(Memento memento){ 
                  this.memento = memento; 
                } 
              } 
              public class Client { 
                public static void main(String[] args){ 
                  Originator originator = new Originator(); 
                  originator.setState("狀態(tài)1"); 
                  System.out.println("初始狀態(tài):"+originator.getState()); 
                  Caretaker caretaker = new Caretaker(); 
                  caretaker.setMemento(originator.createMemento()); 
                  originator.setState("狀態(tài)2"); 
                  System.out.println("改變后狀態(tài):"+originator.getState()); 
                  originator.restoreMemento(caretaker.getMemento()); 
                  System.out.println("恢復后狀態(tài):"+originator.getState()); 
                } 
              }

                    代碼演示了一個單狀態(tài)單備份的例子,邏輯非常簡單:Originator類中的state變量需要備份,以便在需要的時候恢復;Memento類中,也有一個state變量,用來存儲Originator類中state變量的臨時狀態(tài);而Caretaker類就是用來管理備忘錄類的,用來向備忘錄對象中寫入狀態(tài)或者取回狀態(tài)。

            多狀態(tài)多備份備忘錄

                   通用代碼演示的例子中,Originator類只有一個state變量需要備份,而通常情況下,發(fā)起人角色通常是一個javaBean,對象中需要備份的變量不止一個,需要備份的狀態(tài)也不止一個,這就是多狀態(tài)多備份備忘錄。
                    實現備忘錄的方法很多,備忘錄模式有很多變形和處理方式,像通用代碼那樣的方式一般不會用到,多數情況下的備忘錄模式,是多狀態(tài)多備份的。其實實現多狀態(tài)多備份也很簡單,最常用的方法是,我們在Memento中增加一個Map容器來存儲所有的狀態(tài),在Caretaker類中同樣使用一個Map容器才存儲所有的備份。下面我們給出一個多狀態(tài)多備份的例子:

            class Originator { 
                private String state1 = ""; 
                private String state2 = ""; 
                private String state3 = ""; 
               
                public String getState1() { 
                  return state1; 
                } 
                public void setState1(String state1) { 
                  this.state1 = state1; 
                } 
                public String getState2() { 
                  return state2; 
                } 
                public void setState2(String state2) { 
                  this.state2 = state2; 
                } 
                public String getState3() { 
                  return state3; 
                } 
                public void setState3(String state3) { 
                  this.state3 = state3; 
                } 
                public Memento createMemento(){ 
                  return new Memento(BeanUtils.backupProp(this)); 
                } 
                 
                public void restoreMemento(Memento memento){ 
                  BeanUtils.restoreProp(this, memento.getStateMap()); 
                } 
                public String toString(){ 
                  return "state1="+state1+"state2="+state2+"state3="+state3; 
                } 
              } 
              class Memento { 
                private Map<String, Object> stateMap; 
                 
                public Memento(Map<String, Object> map){ 
                  this.stateMap = map; 
                } 
               
                public Map<String, Object> getStateMap() { 
                  return stateMap; 
                } 
               
                public void setStateMap(Map<String, Object> stateMap) { 
                  this.stateMap = stateMap; 
                } 
              } 
              class BeanUtils { 
                public static Map<String, Object> backupProp(Object bean){ 
                  Map<String, Object> result = new HashMap<String, Object>(); 
                  try{ 
                    BeanInfo beanInfo = Introspector.getBeanInfo(bean.getClass()); 
                    PropertyDescriptor[] descriptors = beanInfo.getPropertyDescriptors(); 
                    for(PropertyDescriptor des: descriptors){ 
                      String fieldName = des.getName(); 
                      Method getter = des.getReadMethod(); 
                      Object fieldValue = getter.invoke(bean, new Object[]{}); 
                      if(!fieldName.equalsIgnoreCase("class")){ 
                        result.put(fieldName, fieldValue); 
                      } 
                    } 
                     
                  }catch(Exception e){ 
                    e.printStackTrace(); 
                  } 
                  return result; 
                } 
                 
                public static void restoreProp(Object bean, Map<String, Object> propMap){ 
                  try { 
                    BeanInfo beanInfo = Introspector.getBeanInfo(bean.getClass()); 
                    PropertyDescriptor[] descriptors = beanInfo.getPropertyDescriptors(); 
                    for(PropertyDescriptor des: descriptors){ 
                      String fieldName = des.getName(); 
                      if(propMap.containsKey(fieldName)){ 
                        Method setter = des.getWriteMethod(); 
                        setter.invoke(bean, new Object[]{propMap.get(fieldName)}); 
                      } 
                    } 
                  } catch (Exception e) { 
                    e.printStackTrace(); 
                  } 
                } 
              } 
              class Caretaker { 
                private Map<String, Memento> memMap = new HashMap<String, Memento>(); 
                public Memento getMemento(String index){ 
                  return memMap.get(index); 
                } 
                 
                public void setMemento(String index, Memento memento){ 
                  this.memMap.put(index, memento); 
                } 
              } 
              class Client { 
                public static void main(String[] args){ 
                  Originator ori = new Originator(); 
                  Caretaker caretaker = new Caretaker(); 
                  ori.setState1("中國"); 
                  ori.setState2("強盛"); 
                  ori.setState3("繁榮"); 
                  System.out.println("===初始化狀態(tài)===\n"+ori); 
                   
                  caretaker.setMemento("001",ori.createMemento()); 
                  ori.setState1("軟件"); 
                  ori.setState2("架構"); 
                  ori.setState3("優(yōu)秀"); 
                  System.out.println("===修改后狀態(tài)===\n"+ori); 
                   
                  ori.restoreMemento(caretaker.getMemento("001")); 
                  System.out.println("===恢復后狀態(tài)===\n"+ori); 
                } 
              }

            備忘錄模式的優(yōu)缺點和適用場景

            備忘錄模式的優(yōu)點有:

                    當發(fā)起人角色中的狀態(tài)改變時,有可能這是個錯誤的改變,我們使用備忘錄模式就可以把這個錯誤的改變還原。
                    備份的狀態(tài)是保存在發(fā)起人角色之外的,這樣,發(fā)起人角色就不需要對各個備份的狀態(tài)進行管理。

            備忘錄模式的缺點有:

                    在實際應用中,備忘錄模式都是多狀態(tài)和多備份的,發(fā)起人角色的狀態(tài)需要存儲到備忘錄對象中,對資源的消耗是比較嚴重的。
                    如果有需要提供回滾操作的需求,使用備忘錄模式非常適合,比如jdbc的事務操作,文本編輯器的Ctrl+Z恢復等。

            感謝各位的閱讀!關于“java中備忘錄模式的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

            分享標題:java中備忘錄模式的示例分析-創(chuàng)新互聯(lián)
            文章位置:http://www.jbt999.com/article22/eoojc.html

            成都網站建設公司_創(chuàng)新互聯(lián),為您提供營銷型網站建設企業(yè)網站制作、品牌網站設計網站制作、做網站、云服務器

            廣告

            聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:[email protected]。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

            成都網站建設

              <del id="d4fwx"><form id="d4fwx"></form></del>
              <del id="d4fwx"><form id="d4fwx"></form></del><del id="d4fwx"><form id="d4fwx"></form></del>

                    <code id="d4fwx"><abbr id="d4fwx"></abbr></code>
                  • 亚洲无码视频在线观看观看 | 怡红院AV成人网 | 亚洲在线观看视频网站 | 天天精品在线 | 哪里有免费的av 男女wwwwww |