中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

折騰Java設計模式之備忘錄模式

發布時間:2020-07-02 18:20:30 來源:網絡 閱讀:190 作者:大萌小路 欄目:軟件技術

原文地址:折騰Java設計模式之備忘錄模式

備忘錄模式

Without violating encapsulation, capture and externalize an object's internal state allowing the object to be restored to this state later.

在不破壞封裝性的前提下,捕獲一個對象的內部狀態,并在該對象之外保存這個狀態。

所謂備忘錄模式就是在不破壞封裝的前提下,捕獲一個對象的內部狀態,并在該對象之外保存這個狀態,這樣可以在以后將對象恢復到原先保存的狀態。很多時候我們總是需要記錄一個對象的內部狀態,這樣做的目的就是為了允許用戶取消不確定或者錯誤的操作,能夠恢復到他原先的狀態,使得他有"后悔藥"可吃。通過一個備忘錄類專門存儲對象狀態。客戶不與備忘錄類耦合,與備忘錄管理類耦合。

備忘錄模式UML

折騰Java設計模式之備忘錄模式cdn.xitu.io/2019/4/9/169ffaebd9654dda?w=680&h=240&f=jpeg&s=26778">

UML類圖

Caretaker類是指用于保存(createMemento())和還原(restore(memento))發起方內部狀態的Originator類。
發起方類實現
(1)createMemento(),通過創建和返回存儲發起方當前內部狀態的memento對象
(2)通過從傳入的memento對象還原狀態來還原(memento)。

UML時序圖

(1)保存發起人的內部狀態:Caretaker對Originator調用createMemento(),創建memento對象,保存其當前內部狀態(setState()),并將memento返回給Caretaker。

(2)恢復發起人的內部狀態:Caretaker對Originator調用restore(memento),并指定存儲應恢復狀態的memento對象。發起者從memento獲取狀態(getState())以設置其自己的狀態。

備忘錄模式角色結構

(1) 備忘錄(Memento)角色:備忘錄角色存儲“備忘發起角色”的內部狀態。“備忘發起角色”根據需要決定備忘錄角色存儲“備忘發起角色”的哪些內部狀態。為了防止“備忘發起角色”以外的其他對象訪問備忘錄。備忘錄實際上有兩個接口,“備忘錄管理者角色”只能看到備忘錄提供的窄接口——對于備忘錄角色中存放的屬性是不可見的。“備忘發起角色”則能夠看到一個寬接口——能夠得到自己放入備忘錄角色中屬性。

(2) 備忘發起(Originator)角色:“備忘發起角色”創建一個備忘錄,用以記錄當前時刻它的內部狀態。在需要時使用備忘錄恢復內部狀態。

(3) 備忘錄管理者(Caretaker)角色:負責保存好備忘錄。不能對備忘錄的內容進行操作或檢查。

干貨示例

源碼地址

public class Caretaker {

?    public static void main(String[] args) {
?        List<Memento> savedStates = new ArrayList();
?        Originator originator = new Originator();
?        originator.set("State1");
?        originator.set("State2");
?        savedStates.add(originator.saveToMemento());

?        originator.set("State3");
?        savedStates.add(originator.saveToMemento());

?        originator.set("State4");
?        originator.restoreFromMemento(savedStates.get(1));
?    }
}

@Slf4j
public class Originator {

?    private String state;

?    //狀態更改
?    public void set(String state) {
?        this.state = state;
?        log.info("Originator: Setting state to {}", state);
?    }

?    //將狀態保存到備忘錄里
?    public Memento saveToMemento() {
?        log.info("Originator: Saving to Memento.");
?        return new Memento(this.state);
?    }

?    //從備忘錄里取出狀態并回滾
?    public void restoreFromMemento(Memento memento) {
?        this.state = memento.getState();
?        log.info("Originator: State after restoring from Memento: {}", state);
?    }
}

@Data
@AllArgsConstructor
public class Memento {

?    //狀態維護
?    private String state;

}

示例結果

折騰Java設計模式之備忘錄模式

從上述代碼中看的出,隨著狀態變更,用List維護發起者的狀態列表,從備忘錄中取出狀態以便回退狀態。

java中的使用

生成對象狀態的一個快照,以便對象可以恢復原始狀態而不用暴露自身的內容。Date對象通過自身內部的一個long值來實現備忘錄模式。

java.util.Date

java.io.Serializable

總結

優點

1、給用戶提供了一種可以恢復狀態的機制,可以使用戶能夠比較方便地回到某個歷史的狀態。 2、實現了信息的封裝,使得用戶不需要關心狀態的保存細節。

缺點

消耗資源。如果類的成員變量過多,勢必會占用比較大的資源,而且每一次保存都會消耗一定的內存。

使用場景

1、需要保存/恢復數據的相關狀態場景。 2、提供一個可回滾的操作。

注意事項

1、為了符合迪米特原則,還要增加一個管理備忘錄的類。 2、為了節約內存,可使用原型模式+備忘錄模式。

參考

備忘錄模式|菜鳥教程

Memento pattern

細數JDK里的設計模式

歡迎關注

折騰Java設計模式之備忘錄模式

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

奈曼旗| 奇台县| 库尔勒市| 隆化县| 灌云县| 区。| 个旧市| 宜阳县| 娱乐| 旌德县| 德清县| 象州县| 阿鲁科尔沁旗| 拉萨市| 洞头县| 玛纳斯县| 禹州市| 柏乡县| 应城市| 叙永县| 芮城县| 齐河县| 泗水县| 田林县| 成都市| 萨嘎县| 罗平县| 信宜市| 潍坊市| 长岭县| 内黄县| 固安县| 武威市| 石首市| 伊金霍洛旗| 清新县| 望江县| 夏河县| 桑植县| 镇远县| 长治市|