Volver a aprender patrones de diseño (tres, patrones de diseño - patrón de memo)

1. Modo de memoria

    En la vida diaria, a veces usamos la combinación de teclas Ctrl+Z para deshacer la operación actual al editar un documento. Cuando navegamos por la web, hacemos clic para volver a la página anterior. En el programa, a menudo usamos la operación de reversión en la gestión de transacciones de la base de datos, etc., todo con la esperanza de restaurar los datos al estado anterior.

    A lo largo de los años, esta función se ha vuelto tan común que todo el mundo espera que todas las aplicaciones admitan la operación de respaldo. El patrón de memo que vamos a aprender hoy se usa para hacer esto.

1.1, ¿qué es el modo memo?

  • definición

    El modo Memento es un modo de diseño de comportamiento, también conocido como modo de instantánea, que se refiere a capturar el estado interno de un objeto sin romper la encapsulación y guardar este estado fuera del objeto, de modo que el objeto pueda restaurarse al estado guardado original cuando sea necesario más adelante.

    En términos sencillos, el modo memo es el modo de copia de seguridad de un objeto, que proporciona un método de copia de seguridad para los datos del programa. El método específico utilizado para almacenar el estado del objeto depende de la cantidad de tiempo que el objeto necesita guardarse.

La estructura del patrón de recuerdo:

    1) Rol de originador: registra el estado interno en el momento actual, es responsable de definir qué estados pertenecen al rango de respaldo, es responsable de crear y restaurar los datos de la nota y puede acceder a toda la información en la nota;

    2) Rol Memento: responsable de almacenar el estado interno del iniciador y proporcionar estos estados internos al iniciador cuando sea necesario;

    3) Rol de administrador (cuidador): administra, guarda y proporciona memos, pero no puede acceder ni modificar el contenido de los memos.

    La intención del patrón memento es proporcionar funciones de almacenamiento y recuperación para los estados de los objetos, y los datos de estado guardados de los objetos son inaccesibles fuera del objeto.

1.2 Ventajas y desventajas del modo memo

  • ventaja

    1) Se puede generar una instantánea del objeto sin violar la encapsulación;

    2) Simplificar el código del iniciador. El iniciador no necesita administrar y guardar la copia de seguridad de su estado interno. Toda la información se almacena en la nota y es administrada por el administrador.

  • defecto

    La creación de notas con demasiada frecuencia hará que la aplicación consuma más memoria.

1.3 Método de creación

    Tome el atributo de héroe en League of Legends como ejemplo. Después de comer el beneficio rojo, la efectividad de combate del héroe mejorará y volverá al estado anterior después de que caduque.

1) Rol de originador

//发起人角色,即原始对象,需要备份的对象
public class LolOriginator {

	private String name; //英雄名字
	private String type; //英雄类型
	private Integer  fightingNum; //英雄战斗力
	
	public LolOriginator(String name,String type,Integer fightingNum){
		this.name = name;
		this.type = type;
		this.fightingNum = fightingNum;
	}
	
	//创建一个备忘录,进行备忘操作
	public LolMemento createMemento(){
		return new LolMemento(this);
	}
	
	//恢复成指定备忘录
	public void restoreMemento(LolMemento memento){
		this.name = memento.getName();
		this.type = memento.getType();
		this.fightingNum = memento.getFightingNum();
	}
	
	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public String getType() {
		return type;
	}
	
	public void setType(String type) {
		this.type = type;
	}

	public Integer getFightingNum() {
		return fightingNum;
	}

	public void setFightingNum(Integer fightingNum) {
		this.fightingNum = fightingNum;
	}
	
	@Override
	public String toString() {
		return this.getName()+"-"+this.getType()+"-"+this.getFightingNum();
	}
}

2) Rol de recuerdo

//备忘录
public class LolMemento {

	private String name; //英雄名字
	private String type; //英雄类型
	private Integer  fightingNum; //英雄战斗力
	
	public LolMemento(LolOriginator lol){
		this.name=lol.getName();
		this.type=lol.getType();
		this.fightingNum = lol.getFightingNum();
	}

	public String getName() {
		return name;
	}

	public String getType() {
		return type;
	}

	public Integer getFightingNum() {
		return fightingNum;
	}
	
}

3) Rol de cuidador

//管理者,负责管理备忘录对象
public class LolCaretaker {

	private LolMemento memento;

	//如果有一连串的状态加成,可以保存多个状态
	//private List<LolMemento> mementoList = new ArrayList<LolMemento>();
	
	public LolMemento getMemento() {
		return memento;
	}

	public void setMemento(LolMemento memento) {
		this.memento = memento;
	}
	
}

4) cliente

public class Client {

	public static void main(String[] args) {
		//备忘录管理者
		LolCaretaker taker = new LolCaretaker();
		
		//创建一个英雄
		System.out.println("当前的英雄信息:");
		LolOriginator lol = new LolOriginator("德玛西亚之力", "战士", 666);
		System.out.println("  "+lol.toString());
		
		//进行一次备忘
		taker.setMemento(lol.createMemento());
		
		System.out.println("吃了一个红buff:");
		lol.setFightingNum(700);
		System.out.println("  "+lol.toString());
		
		System.out.println("红buff已经失效:");
		lol.restoreMemento(taker.getMemento());  //恢复到之前的状态
		
		System.out.println("  "+lol.toString());
		
	}
}

Efecto de caso:

 

El diagrama UML en este momento:

1.4 Resumen y sugerencias

    Con el modo memento, se puede capturar el estado del objeto, y los datos de estado guardados del objeto son inaccesibles fuera del objeto, lo que protege la integridad de los datos de estado guardados, que también es la ventaja del modo memo.

    Lo que podemos usar más es almacenar el estado del objeto en otro objeto o admitir el almacenamiento persistente de objetos en varias sesiones, y usar la serialización de objetos para almacenar información de objetos, que es el modo prototipo que aprendimos anteriormente. El modo prototipo puede ser un sustituto del modo memo. Por lo tanto, el patrón de memo no se usa comúnmente.

Escenario de aplicación:

    1) El patrón memento se puede usar cuando desea generar una instantánea del estado del objeto para que pueda restaurar el estado anterior del objeto;

    2) Cuando el acceso directo al captador y definidor de campo del objeto viola su encapsulación, se puede usar el modo memo.

Aplicación del modo memo en JDK:

    Todas las implementaciones java.io.Serializable pueden simular Memento

    Implementación de javax.faces.component.StateHolder

Supongo que te gusta

Origin blog.csdn.net/xiaoxianer321/article/details/125476637
Recomendado
Clasificación