备忘录设计模式

作者: OneXzgj | 来源:发表于2019-07-27 21:07 被阅读8次
  • 1.定义:
  • 2.简单描述:
  • 3.UML建模图
  • 4.简单示例:
  • 5.Android中的备忘录设计模式:
  • 6.备忘录优缺点:

1.定义:

备忘录模式属于行为型模式,它通过在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。

2.简单描述:

备忘录模式用户保存对象的状态,并且以后恰当时间可以再次恢复到此状态。即可以保存和获取该对象的状态。

3.UML建模图

image.png

UML角色解读:
1.Memoto:备忘录角色,用于保存Originator中的状态
2.Originator:负责创建备忘录,可以记录和恢复自身内部维护的状态对象
3.Caretaker:负责存储备忘录,不对备忘录的内容操作和访问,只能将对象传递给其他对象。

4.简单示例:

备忘录模式以游戏中最为常见,比如玩游戏玩到什么进度,下次进入游戏的时候回直接从上次退出的进度中继续玩。就以该示例为示范,在代码中是如何实现。

Memoto对象

/**
 * 备忘录类
 */
public class Memoto {

    /**
     * 用户ID
     */
    public String userId;
    /**
     * 游戏进度
     */
    public int progress;

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public int getProgress() {
        return progress;
    }

    public void setProgress(int progress) {
        this.progress = progress;
    }
}

Caretaker对象

/**
 * 负责Memoto类的存储
 */
public class Caretaker {
    private Memoto mMemoto;

    /**
     * 保存状态
     * @param memoto 备忘录对象
     */
    public void saveMemoto(Memoto memoto){
        this.mMemoto=memoto;
    }

    /**
     * 获取状态对象
     * @return
     */
    public Memoto getMemoto(){
        return mMemoto;
    }

}

Originator对象

/**
 * 需要备忘的角色
 */
public class LolGame {

    private String userId;
    private int progress = 0;
    private String monemy;
    private Memoto mMemoto;

    public void play() {

        userId = getUserId();
        ++progress;
        System.out.println("开始玩游戏了...");
        System.out.println("--- userId: " + userId + " --- progress: " +progress+ " ---");

    }

    /**
     * 退出游戏
     */
    public void quit(){
        System.out.println("退出游戏了...");
    }


    /**
     * 创建备忘录对象
     *
     * @return
     */
    public Memoto createMemoto() {
        mMemoto = new Memoto();
        mMemoto.userId = userId;
        mMemoto.progress = progress;
        return mMemoto;
    }

    /**
     * 恢复备忘录
     */
    public void restoreMemoto(Memoto memoto) {
        this.userId = memoto.userId;
        this.progress = memoto.progress;
        System.out.println("----恢复备忘录----");
    }


    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public int getProgress() {
        return progress;
    }

    public void setProgress(int progress) {
        this.progress = progress;
    }

}

游戏类

/**
 * 玩家玩游戏
 */
public class Client {
    public static void main(String[] args) {
        LolGame player = new LolGame();
        player.setUserId("onex");
        player.play();

        Caretaker caretaker =new Caretaker();
        caretaker.saveMemoto(player.createMemoto());

        player.quit();

        player = new LolGame();

        player.restoreMemoto(caretaker.getMemoto());
        player.play();

    }
}

运行结果:

开始玩游戏了...
--- userId: onex --- progress: 1 ---
退出游戏了...
----恢复备忘录----
开始玩游戏了...
--- userId: onex --- progress: 2 ---

Process finished with exit code 0

5.Android中的备忘录设计模式:

在Android开发中,状态模式应用是Activity中的状态保存,即onSaveInstanceState和OnRestoreInstanceState实现ViewGroup和View的状态的保存和恢复

保存Activity的对象即View的状态

 protected void onSaveInstanceState(Bundle outState) {
        outState.putBundle(WINDOW_HIERARCHY_TAG, mWindow.saveHierarchyState());

        outState.putInt(LAST_AUTOFILL_ID, mLastAutofillId);
        Parcelable p = mFragments.saveAllState();
        if (p != null) {
            outState.putParcelable(FRAGMENTS_TAG, p);
        }
        if (mAutoFillResetNeeded) {
            outState.putBoolean(AUTOFILL_RESET_NEEDED, true);
            getAutofillManager().onSaveInstanceState(outState);
        }
        getApplication().dispatchActivitySaveInstanceState(this, outState);
    }

恢复View(ViewGroup)的状态

   protected void onRestoreInstanceState(Bundle savedInstanceState) {
        if (mWindow != null) {
            Bundle windowState = savedInstanceState.getBundle(WINDOW_HIERARCHY_TAG);
            if (windowState != null) {
                mWindow.restoreHierarchyState(windowState);
            }
        }
    }

即Bundle为Memoto对象,Activity为Caretaker对象,View(ViewGroup)为Originator

6.备忘录优缺点:

优点
给对象提供状态可恢复的机制,使得对象方便恢复到历史的状态
实现了信息的封装,使得用户不用关心状态的保存细节

缺点
消耗资源,如果类的成员变量很多及保需要保存的状态太多,会消耗一定的内存

相关文章

网友评论

    本文标题:备忘录设计模式

    本文链接:https://www.haomeiwen.com/subject/kbgerctx.html