[Modo de diseño] 19, modo memo

(19) Modo de memoria

El Patrón Memento se refiere a capturar el estado interno de un objeto y guardar este estado fuera del objeto sin romper la encapsulación. Similar al mecanismo de instantáneas.

1. Principios de diseño del patrón de notas

1. Originador: Responsable de crear un memorando para registrar el estado que debe guardarse;

2. Memento: se utiliza para almacenar el estado interno del originador y puede evitar que accedan otros objetos que no sean el originador;

3. Encargado: Responsable de la gestión y creación de memorandos.

2. Caso sencillo

La implementación del cuadro de borrador es en forma de memo. A través del cuadro de borrador, puede restaurar el contenido que escribió antes, e incluso restaurarlo infinitamente. De hecho, en algunos escenarios, también podemos considerar usar la forma de una matriz en lugar de una pila, de modo que podamos recurrir a la versión especificada de acuerdo con el índice.

public class Editor {
    
    
    private String title;
    private String content;
    private String img;

	//get,set

    //    保存功能,实际是保存到备忘录
    public ArticleMemento saveToMemento() {
    
    
        ArticleMemento articleMemento = new ArticleMemento(this.title, this.content, this.img);
        return articleMemento;
    }

//    撤销功能就是从栈中取出上一个ArticleMemento对象
    public void undoFromMemento(ArticleMemento articleMemento) {
    
    
        this.title = articleMemento.getTitle();
        this.content = articleMemento.getContent();
        this.img = articleMemento.getImg();
    }

   //全参构造
   //重写tosting
}
public class ArticleMemento {
    
    
    private String title;
    private String content;
    private String img;

    public String getTitle() {
    
    
        return title;
    }

    public String getContent() {
    
    
        return content;
    }

    public String getImg() {
    
    
        return img;
    }
    
	//全参构造
   //重写tosting
    
}
public class DraftBox {
    
    
    private final Stack<ArticleMemento> STACK = new Stack<>();

    public ArticleMemento getMemento() {
    
    
        ArticleMemento articleMemento = null;
//        业务场景一:草稿实时保存,所以撤销指的是回滚到上一版本,并不是上一步。
//        第一次弹栈是当前对象,第二次弹栈是上一个对象。
//        articleMemento = STACK.pop();
//        articleMemento = STACK.pop();

//        业务场景二:及时撤销,用户在不保存的情况下撤销,即回退到上一步。
        articleMemento = STACK.pop();

        return articleMemento;
    }

    public void addMemento(ArticleMemento articleMemento) {
    
    
        STACK.push(articleMemento);
    }
}
public class Client {
    
    
    public static void main(String[] args) {
    
    
        DraftBox draftBox = new DraftBox();
        Editor editor = new Editor("标题1", "备忘录模式", "abc.img");
        ArticleMemento articleMemento = editor.saveToMemento();
        draftBox.addMemento(articleMemento);
        System.out.println(editor.getTitle()+"\t"+editor.getContent()+"\t"+editor.getImg());

        System.out.println("修改标题");
        editor.setTitle("标题2");
        System.out.println("发生了修改后");
//        业务场景一:修改后并保存
       /* articleMemento = editor.saveToMemento();
        draftBox.addMemento(articleMemento);*/
        System.out.println(editor.getTitle()+"\t"+editor.getContent()+"\t"+editor.getImg());

//        测试业务场景一
        articleMemento = draftBox.getMemento();
        editor.undoFromMemento(articleMemento);
        System.out.println("执行撤销指令后");
        System.out.println(editor.getTitle()+"\t"+editor.getContent()+"\t"+editor.getImg());
    }
}
imagen-20210319090547678

3. Comentarios en el modo memo

El modo memento es muy adecuado para escenarios de negocios que deben revertirse, pero se puede ver que una variable miembro del objeto de operación debe mantenerse en Memento, lo que puede complicar fácilmente el sistema.

Supongo que te gusta

Origin blog.csdn.net/qq_40589204/article/details/118511820
Recomendado
Clasificación