Réapprentissage des modèles de conception (trois, modèles de conception - modèle de mémo)

1. Mode mémo

    Dans la vie de tous les jours, nous utilisons parfois la combinaison de touches Ctrl+Z pour annuler l'opération en cours lors de l'édition d'un document. Lorsque nous naviguons sur le Web, nous cliquons pour revenir à la page précédente. Dans le programme, nous utilisons souvent l'opération de restauration dans la gestion des transactions de base de données, etc., dans l'espoir de restaurer les données à l'état précédent.

    Au fil des ans, cette fonctionnalité est devenue si courante que tout le monde s'attend à ce que chaque application prenne en charge l'opération de secours. Le modèle de mémo que nous allons apprendre aujourd'hui est utilisé pour ce faire.

1.1, qu'est-ce que le mode mémo

  • définition

    Le mode mémento est un mode de conception comportementale, également connu sous le nom de mode instantané, qui fait référence à la capture de l'état interne d'un objet sans rompre l'encapsulation, et à l'enregistrement de cet état en dehors de l'objet, afin que l'objet puisse être restauré à l'état enregistré d'origine en cas de besoin ultérieur.

    En termes simples, le mode mémo est le mode de sauvegarde d'un objet, qui fournit une méthode de sauvegarde pour les données du programme. La méthode spécifique utilisée pour stocker l'état de l'objet dépend de la durée pendant laquelle l'objet doit être sauvegardé.

La structure du motif mémento :

    1) Rôle d'origine : enregistre l'état interne à l'instant présent, est responsable de la définition des états appartenant à la plage de sauvegarde, est responsable de la création et de la restauration des données du mémo et peut accéder à toutes les informations du mémo ;

    2) Rôle de mémento : chargé de stocker l'état interne de l'initiateur et de fournir ces états internes à l'initiateur en cas de besoin ;

    3) Rôle de gestionnaire (gardien) : gère, enregistre et fournit des mémos, mais ne peut pas accéder ni modifier le contenu des mémos.

    L'intention du modèle memento est de fournir des fonctions de stockage et de récupération pour les états d'objet, et les données d'état enregistrées des objets sont inaccessibles en dehors de l'objet.

1.2. Avantages et inconvénients du mode mémo

  • avantage

    1) Un instantané de l'objet peut être généré sans violer l'encapsulation ;

    2) Simplifier le code de l'initiateur L'initiateur n'a pas besoin de gérer et de sauvegarder la sauvegarde de son état interne Toutes les informations sont stockées dans le mémo et gérées par le gestionnaire.

  • défaut

    Si vous créez trop fréquemment des mémos, l'application consommera plus de mémoire.

1.3. Méthode de création

    Prenons l'exemple de l'attribut de héros dans League of Legends.Après avoir mangé le buff rouge, l'efficacité au combat du héros sera améliorée et il reviendra à l'état précédent après son expiration.

1) Rôle d'initiateur

//发起人角色,即原始对象,需要备份的对象
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) Rôle de souvenir

//备忘录
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) Rôle de gardien

//管理者,负责管理备忘录对象
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());
		
	}
}

Effet de cas :

 

Le diagramme UML à ce moment :

1.4. Résumé et suggestions

    Avec le mode mémento, l'état de l'objet peut être capturé et les données d'état enregistrées de l'objet sont inaccessibles en dehors de l'objet, ce qui protège l'intégrité des données d'état enregistrées, ce qui est également l'avantage du mode mémo.

    Ce que nous pouvons utiliser davantage est de stocker l'état de l'objet dans un autre objet ou de prendre en charge le stockage persistant d'objets sur plusieurs sessions, et d'utiliser la sérialisation d'objets pour stocker les informations d'objet, qui est le mode prototype que nous avons appris précédemment. Le mode prototype peut remplacer le mode mémo. Ainsi, le modèle de mémo n'est pas couramment utilisé.

Scénario d'application :

    1) Le modèle de mémento peut être utilisé lorsque vous souhaitez générer un instantané de l'état de l'objet afin de pouvoir restaurer l'état précédent de l'objet ;

    2) Lorsque l'accès direct au getter et au setter de champ de l'objet viole son encapsulation, le mode mémo peut être utilisé.

Application du mode mémo dans JDK :

    Toutes les implémentations java.io.Serializable peuvent se moquer de Memento

    Implémentation de javax.faces.component.StateHolder

Je suppose que tu aimes

Origine blog.csdn.net/xiaoxianer321/article/details/125476637
conseillé
Classement