昨天下班後去二輪看了兩部片,發覺到最近看的電影都與女性有關,現在女性(當然也有男性)在社會中的角色,家庭工作感情等等的平衡之類的。在女性現在越來越能自主決定生活和工作,但是相對的社會工時變高薪水卻相對物價低了之後,也是一個大普遍性的問題呢。
昨天討論到的狀態模式,可以讓各個State決定何時前往下一State或是由Context控制(這樣有一點類似策略模式)。而今天的要介紹的備忘錄模式(Memoto),則是把某一個時間點的State記錄下來,就像是遊戲的儲存和讀取,或是photoshop紀錄筆畫,可以隨時上一步或是下一步。
在不破壞封裝性的前提之下,捕獲一個物件的內部狀態,並在該物件之外保存這個狀態。這樣以後就可將該物件恢復到原先保存的狀態。
-- 大話設計模式 p266
永久性的資料會存在資料庫(硬碟中),而備忘錄模式是把某個物件的狀態存在記憶體中,以便未來可以反悔。

電腦一定時間會自我記憶一次哪些東西在使用···其他就可以休眠。
Memoto類別存放現在電腦資訊
public class ComputerMemoto {
    String system;
    String hardisk;
    String userDoc;
    String userApp;
    public ComputerMemoto(String system, String hardisk, String userDoc, String userApp) {
        this.system = system;
        this.hardisk = hardisk;
        this.userDoc = userDoc;
        this.userApp = userApp;
    }
    public String getSystem() {
        return system;
    }
    public void setSystem(String system) {
        this.system = system;
    }
    public String getHardisk() {
        return hardisk;
    }
    public void setHardisk(String hardisk) {
        this.hardisk = hardisk;
    }
    public String getUserDoc() {
        return userDoc;
    }
    public void setUserDoc(String userDoc) {
        this.userDoc = userDoc;
    }
    public String getUserApp() {
        return userApp;
    }
    public void setUserApp(String userApp) {
        this.userApp = userApp;
    }
}
產生備忘錄的類別
public class ComputerOriginator {
    private String system = "macOS";
    private String hardisk = "ssd";
    private String userDoc = "desk";
    private String userApp = "pages,numbers...";
    public ComputerMemoto save(){
        return new ComputerMemoto(system,hardisk,userDoc,userApp);
    }
    public void restore(ComputerMemoto memoto){
        this.hardisk = memoto.getHardisk();
        this.system = memoto.getSystem();
        this.userApp = memoto.getUserApp();
        this.userDoc = memoto.getUserDoc();
    }
    public String getSystem() {
        return system;
    }
    public void setSystem(String system) {
        this.system = system;
    }
    public String getHardisk() {
        return hardisk;
    }
    public void setHardisk(String hardisk) {
        this.hardisk = hardisk;
    }
    public String getUserDoc() {
        return userDoc;
    }
    public void setUserDoc(String userDoc) {
        this.userDoc = userDoc;
    }
    public String getUserApp() {
        return userApp;
    }
    public void setUserApp(String userApp) {
        this.userApp = userApp;
    }
}
存放這些資訊的類別
import java.util.ArrayList;
import java.util.List;
public class ComputerCareTaker {
//    最多備份15筆
    private static final int MAX = 15;
    public List<ComputerMemoto> saves = new ArrayList<>();
//    獲取電腦資訊
    public ComputerMemoto getSave(int index){
        if(index > saves.size() - 1){
            index = saves.size() - 1 ;
        }
        return saves.get(index);
    }
    public void saveMemoto(ComputerMemoto memoto){
        if (saves.size() > MAX){
            saves.remove(0);
        }
        saves.add(memoto);
    }
}
測試一下
public class Test {
    @org.junit.jupiter.api.Test
    public void test(){
        ComputerCareTaker careTaker = new ComputerCareTaker();
        ComputerOriginator originator = new ComputerOriginator();
        careTaker.saveMemoto(originator.save());
        System.out.println(careTaker.getSave(0).getSystem());
        originator.setSystem("windows");
        careTaker.saveMemoto(originator.save());
        System.out.println(careTaker.getSave(1).getSystem());
    }
}
結果
macOS
windows
備忘錄模式也常常看到,在編輯文件時的undo和redo就是備忘錄模式的應用!在CareTaker類別做一些修改(新增對應Undo、Redo的方法)可以就達到想要的效果,今天分享到這邊~如果有什麼問題歡迎提出、感恩!