1. 程式人生 > >備忘錄模式【行為模式】

備忘錄模式【行為模式】

備忘錄模式

Without violating encapsulation,capture and externalize an object's internal state 
so that the object can be restored to this state later.
在不破壞封裝性的前提下,捕獲一個物件的內部狀態並將其外部化,這樣,該物件就可以在之後恢復到該狀態。
public class Memento {
    /**
     * 備忘錄模式:
     * Without violating encapsulation,capture and externalize an object's internal state
     * so that the object can be restored to this state later.
     * 在不破壞封裝性的前提下,捕獲一個物件的內部狀態並將其外部化,這樣,該物件就可以在之後恢復到該狀態。
     */
    @Test
    public void all() {
        final Boy boy = Boy.builder().state("happy").build();
        // 基於目標物件建立備忘錄
        final BoyMemento create = boy.createMemento();

        // 改變物件的內部狀態
        boy.changeState();
        assertEquals("unhappy", boy.getState());

        // 從備忘錄中恢復物件的狀態
        boy.restoreMemento(create);
        assertEquals("happy", boy.getState());
    }
}
/**
 * 1)需要捕獲內部狀態的物件
 */
@Data
@Builder
class Boy{
    private String state;
    public BoyMemento createMemento() {
        return BoyMemento.builder().state(state).build();
    }
    public void restoreMemento(BoyMemento memento) {
        setState(memento.getState());
    }
    public void changeState() {
        setState("unhappy");
    }
}

/**
 * 2)備忘錄物件
 */
@Data
@Builder
class BoyMemento{
    private String state;
}