欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java描述设计模式(24):备忘录模式

程序员文章站 2022-03-25 20:52:01
本文源码: "GitHub·点这里" || "GitEE·点这里" 一、生活场景 1、场景描述 常见的视频播放软件都具备这样一个功能:假设在播放视频西游记,如果这时候切换播放视频红楼梦,当再次切回播放西游记时,视频会从上次切走的时间点继续播放。下面基于备忘录设计模式来描述该场景流程。 2、场景图解 ......

本文源码:github·点这里 || gitee·点这里

一、生活场景

1、场景描述

常见的视频播放软件都具备这样一个功能:假设在播放视频西游记,如果这时候切换播放视频红楼梦,当再次切回播放西游记时,视频会从上次切走的时间点继续播放。下面基于备忘录设计模式来描述该场景流程。

2、场景图解

Java描述设计模式(24):备忘录模式

3、代码实现

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;
    }
}

执行效果:

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

二、备忘录模式

1、基础概念

备忘录模式属于行为型模式,其用意在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。后续可将该对象恢复到原先保存的状态。备忘录对象主要用来记录一个对象的某种状态,或者某些数据,当要做回退时,可以从备忘录对象里获取原来的数据进行恢复操作。

2、模式图解

Java描述设计模式(24):备忘录模式

3、核心角色

  • 备忘录角色

负责保存对象状态的记录,即originator内部状态。

  • 发起人角色

创建一个含有当前的内部状态的备忘录对象,用来保存状态。

  • 守护者对象

提供合理的方式,负责保存多个备忘录对象。

4、源码实现

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();
    }
}

三、模式总结

1、优缺点描述

备忘录模式提供一种可以恢复状态的机制,实现状态的封装,能够比较方便地回到某个历史的状态;常常与命令模式和迭代器模式一同使用。如果类的成员变量过多,会占用比较大的内存资源,为了节约内存,备忘录模式可以和原型模式配合使用。

2、应用场景

  • 浏览器的前进和回退;
  • 数据库备份与还原;
  • 编辑器ctrl+z撤销;
  • 虚拟机生成快照与恢复;
  • git版本管理,代码的提交和回滚。

四、源代码地址

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

Java描述设计模式(24):备忘录模式