1. 程式人生 > 實用技巧 >Java學習筆記(六) 分支語句

Java學習筆記(六) 分支語句

定義:在不破壞封裝性的前提下,捕獲一個物件的內部狀態,並在該物件之外儲存這個狀態,以便以後當需要時,能將該物件恢復到原先儲存的狀態。

優點:

1,提供了一種可以恢復狀態的機制,當用戶需要時能夠比較方地將資料恢復到某個歷史的狀態

2,實現了內部狀態的封裝,除了建立它的發起人之外,其他物件都不能夠訪問這寫狀態資訊

3,簡化了發起人類,發起人不需要管理和儲存其內部狀態的各個部分,所有狀態資訊都儲存在備忘錄中,並由管理者進行管理,這符合單一職責原則

缺點:

資源消耗大,如果要儲存的內部狀態資訊過多或者特別頻繁,將會佔用比較大的記憶體資源

模式的結構

1,發起人角色:記錄當前時刻的內部狀態資訊,提供建立備忘錄和恢復備忘錄資料的功能,實現其他業務功能,它可以訪問備忘錄裡的所有資訊

2,備忘錄角色:負責儲存發起人的內部狀態,在需要的時候提供這些內部狀態給發起人

3,管理者角色:對備忘錄進行管理,提供儲存與獲取備忘錄的功能,但不能對備忘錄的內容進行訪問與修改

使用場景

1,需要儲存與恢復資料的場景,如玩遊戲時的中間結果的存檔功能

2,需要提供一個回滾操作功能的場景,如:word,記事本,photoshop,eclise等軟體在編輯時按ctrl+z組合鍵,還有資料庫事務操作

程式碼:

package memento;
public class MementoPattern
{
    public static void main(String[] args)
    {
        Originator or=new Originator();
        Caretaker cr=new Caretaker();       
        or.setState("S0"); 
        System.out.println("初始狀態:"+or.getState());           
        cr.setMemento(or.createMemento()); //儲存狀態      
        or.setState("S1"); 
        System.out.println("新的狀態:"+or.getState());        
        or.restoreMemento(cr.getMemento()); //恢復狀態
        System.out.println("恢復狀態:"+or.getState());
    }
}
//備忘錄
class Memento
{ 
    private String state; 
    public Memento(String state)
    { 
        this.state=state; 
    }     
    public void setState(String state)
    { 
        this.state=state; 
    }
    public String getState()
    { 
        return state; 
    }
}
//發起人
class Originator
{ 
    private String state;     
    public void setState(String state)
    { 
        this.state=state; 
    }
    public String getState()
    { 
        return state; 
    }
    public Memento createMemento()
    { 
        return new Memento(state); 
    } 
    public void restoreMemento(Memento m)
    { 
        this.setState(m.getState()); 
    } 
}
//管理者
class Caretaker
{ 
    private Memento memento;       
    public void setMemento(Memento m)
    { 
        memento=m; 
    }
    public Memento getMemento()
    { 
        return memento; 
    }
}