Java design patterns described in (24): memo mode

This article Source: GitHub · Click here || GitEE · Click here

A living scene

1, scene description

Common video player software all have a feature like this: Suppose play video Journey to the West, if this switch when playing video Dream of Red Mansions, cut back again when playing Journey to the West, the video will continue to play from the point of time of the last cut away. The following is described based on the memorandum mode of the scene design process.

2, illustrating scenes

3, code implementation

public class C01_InScene {
    public static void main(String[] args) {
        Record record = new Record() ;
        Player player = new Player() ;
        PlayData pd1 = new PlayData("西游记","19:19") ;
        PlayData pd2 = new PlayData("红楼梦","29:19") ;
        player.setPlayData(pd1);
        player.saveProgress() ;
        System.out.println("正在播放:"+
                player.getPlayData().getVideoName()+":"+
                player.getPlayData().getPlayTime());
        record.put(new Progress(pd1));
        System.out.println("===切换播放视频===");
        player.setPlayData(pd2);
        player.saveProgress() ;
        System.out.println("正在播放:"+
                player.getPlayData().getVideoName()+":"+
                player.getPlayData().getPlayTime());
        record.put(new Progress(pd1));
        System.out.println("===切回上个视频===");
        player.resumeProgress(record.get(pd1.getVideoName()));
        System.out.println("正在播放:"+
                player.getPlayData().getVideoName()+":"+
                player.getPlayData().getPlayTime());
    }
}
/**
 * 视频播放器
 */
class Player {
    private PlayData playData ;
    public PlayData getPlayData() {
        return playData;
    }
    public void setPlayData(PlayData playData) {
        this.playData = playData;
    }
    public Progress saveProgress (){
        return new Progress(playData) ;
    }
    public void resumeProgress (Progress progress){
        playData = progress.getPlayData() ;
    }
}
/**
 * 播放进度
 */
class Progress {
    private PlayData playData ;
    public Progress (PlayData playData){
        this.playData = playData ;
    }
    public PlayData getPlayData() {
        return playData ;
    }
}
/**
 * 播放记录
 */
class Record {
    private Map<String,Progress> dataMap = new HashMap<>() ;
    public void put (Progress progress){
        dataMap.put(progress.getPlayData().getVideoName(),progress) ;
    }
    public Progress get (String videoName){
        return dataMap.get(videoName) ;
    }
}
/**
 * 播放状态描述
 */
class PlayData {
    private String videoName ;
    private String playTime ;
    public PlayData(String videoName, String playTime) {
        this.videoName = videoName;
        this.playTime = playTime;
    }
    public String getVideoName() {
        return videoName;
    }
    public void setVideoName(String videoName) {
        this.videoName = videoName;
    }
    public String getPlayTime() {
        return playTime;
    }
    public void setPlayTime(String playTime) {
        this.playTime = playTime;
    }
}

Implementation of the results:

正在播放:西游记:19:19
===切换播放视频===
正在播放:红楼梦:29:19
===切回上个视频===
正在播放:西游记:19:19

Second, the memo mode

1, the basic concept

Behavioral patterns belonging memo mode, the intention without violating encapsulation, capture and the internal state of an object, and save the state outside the object. The object can be restored subsequent to a previously saved state. Memo is primarily used to record the state of an object of some kind, or some of the data, when to do rollback, you can get the original data from the memo object in the recovery operation.

2, illustrates a pattern

3, the core role

  • Memorandum role

Responsible for recordkeeping object state, namely Originator internal state.

  • Sponsor role

Creating a memo object containing the current internal state, used to save the state.

  • Guardian objects

Provide a reasonable way, responsible for keeping multiple memos objects.

4, source code implementation

public class C02_Memento {
    public static void main(String[] args) {
        Originator originator = new Originator();
        Caretaker caretaker = new Caretaker();
        originator.setState("状态1:State01");
        caretaker.add(originator.saveStateMemento());
        originator.setState("状态2:State02");
        caretaker.add(originator.saveStateMemento());
        System.out.println("当前的状态是 =" + originator.getState());
        // 恢复状态
        originator.getStateFromMemento(caretaker.get(0));
        System.out.println("当前的状态是 =" + originator.getState());
    }
}
/**
 * 守护者对象
 */
class Caretaker {
    private List<Memento> mementoList = new ArrayList<>();
    public void add(Memento memento) {
        mementoList.add(memento);
    }
    public Memento get (int index) {
        return mementoList.get(index);
    }
}
/**
 * 备忘录角色
 */
class Memento {
    private String state;
    public Memento(String state) {
        super();
        this.state = state;
    }
    public String getState() {
        return state;
    }
}
/**
 * 发起人角色
 */
class Originator {
    private String state;
    public String getState() {
        return state;
    }
    public void setState(String state) {
        this.state = state;
    }
    public Memento saveStateMemento() {
        return new Memento(state);
    }
    public void getStateFromMemento(Memento memento) {
        state = memento.getState();
    }
}

Third, the model summary

1, describes the advantages and disadvantages

Memo mode provides a mechanism to restore the status of the package to achieve status can be more convenient to return to the status of a history; often used with command mode and iterator pattern. If the member variable class too, will take up a relatively large memory resources, in order to save memory, memo mode can be used in conjunction with models and prototypes.

2, application scenarios

  • Browser forward and rollback;
  • Database backup and restore;
  • Editor Ctrl+Zrevoked;
  • A snapshot of the virtual machine and restore;
  • Commit and rollback Git version management, code.

Fourth, the source address

GitHub·地址
https://github.com/cicadasmile/model-arithmetic-parent
GitEE·地址
https://gitee.com/cicadasmile/model-arithmetic-parent

Guess you like

Origin www.cnblogs.com/cicada-smile/p/11946728.html
Recommended