デザインパターンメモモード注意事項
説明する
デザインパターン学習の書き方〜パターンメモを記録します。使用される JDK バージョンはバージョン 1.8 です。
メメント(メモ)
Intent : オブジェクトの内部状態をキャプチャし、カプセル化を壊さずにこの状態をオブジェクトの外部に保存します。これにより、後でオブジェクトを元の保存状態に復元できます。
構造:
で:
- Memento (memo) は発信者オブジェクトの内部状態を格納します。発信者は必要に応じて発信者のオブジェクトの内部状態を決定し、発信者以外の他のオブジェクトが memento にアクセスできないようにします。
- 発信者は現時点での内部状態を記録するメモを作成し、そのメモを使用して内部状態を復元します。
- メモの保存責任は管理者(管理者)にあり、メモの内容を操作したり確認したりすることはできません。
適用性:
- ゲームプレイ時の途中結果のアーカイブ機能など、データの保存と復元が必要なシナリオ。
- Word メモ帳、Photoshop、Idea などのソフトウェアでの編集中、およびデータベースでのトランザクション操作中に Ctrl + キーの組み合わせを押すなど、ロールバック操作を実行できるシナリオを提供する必要があります。
目次
ホワイトボックスメモモード
メモパターンの例のクラス図
この UML クラス図を使用して、ホワイト ボックス メモ パターンの例を実装します。
ゲームのキャラクター
package com.example.deesign_patterns.memento.white_box;
//游戏角色类(属于发起人角色)
public class GameRole {
private int vit;//生命力
private int atk;//攻击力
private int def;//防御力
//初始化内部状态
public void initState(){
this.vit=100;
this.atk=100;
this.def=100;
}
//战斗方法
public void fight(){
this.vit=0;
this.atk=0;
this.def=0;
}
//保存角色状态功能
public RoleStateMemento saveState(){
return new RoleStateMemento(vit,atk,def);
}
//恢复角色状态
public void recoverState(RoleStateMemento roleStateMemento){
//将备忘录对象中存储的状态赋值给当前对象的成员
this.vit=roleStateMemento.getVit();
this.atk=roleStateMemento.getAtk();
this.def=roleStateMemento.getDef();
}
//展示状态功能
public void stateDisplay(){
System.out.println("角色生命力:"+vit);
System.out.println("角色攻击力:"+atk);
System.out.println("角色防御力:"+def);
}
public int getVit() {
return vit;
}
public void setVit(int vit) {
this.vit = vit;
}
public int getAtk() {
return atk;
}
public void setAtk(int atk) {
this.atk = atk;
}
public int getDef() {
return def;
}
public void setDef(int def) {
this.def = def;
}
}
メモロールクラス
package com.example.deesign_patterns.memento.white_box;
//备忘录角色类
public class RoleStateMemento {
private int vit;//生命力
private int atk;//攻击力
private int def;//防御力
public RoleStateMemento() {
}
public RoleStateMemento(int vit, int atk, int def) {
this.vit = vit;
this.atk = atk;
this.def = def;
}
public int getVit() {
return vit;
}
public void setVit(int vit) {
this.vit = vit;
}
public int getAtk() {
return atk;
}
public void setAtk(int atk) {
this.atk = atk;
}
public int getDef() {
return def;
}
public void setDef(int def) {
this.def = def;
}
}
メモオブジェクト管理オブジェクト
package com.example.deesign_patterns.memento.white_box;
//备忘录对象管理对象
public class RoleStateCaretaker {
//声明RoleStateMemento类型的变量
private RoleStateMemento roleStateMemento;
public RoleStateMemento getRoleStateMemento() {
return roleStateMemento;
}
public void setRoleStateMemento(RoleStateMemento roleStateMemento) {
this.roleStateMemento = roleStateMemento;
}
}
テストクラス
package com.example.deesign_patterns.memento.white_box;
//测试类
public class Client {
public static void main(String[] args) {
System.out.println("-----------大战boos前-------------");
//创建游戏角色对象
GameRole gameRole=new GameRole();
gameRole.initState();
gameRole.stateDisplay();
//将该游戏角色内部状态进行备份
//创建管理者对象
RoleStateCaretaker roleStateCaretaker=new RoleStateCaretaker();
roleStateCaretaker.setRoleStateMemento(gameRole.saveState());
System.out.println("-----------大战boos后-------------");
//损耗严重
gameRole.fight();
gameRole.stateDisplay();
System.out.println("-----------恢复之前的状态-------------");
gameRole.recoverState(roleStateCaretaker.getRoleStateMemento());
gameRole.stateDisplay();
}
}
ブラックボックスメモモード
メモパターンの例のクラス図
memento ロールは、イニシエーター オブジェクトには幅広いインターフェイスを提供し、他のオブジェクトには狭いインターフェイスを提供します。Java 言語では、デュアル インターフェイスを実装する方法は、メモ クラスを人間を開始する内部メンバー クラスとして設計することです。
RoleStateMemento を GameRole の内部クラスとして設定し、それによって Gamerole 内に RoleStateMemento オブジェクトをカプセル化します。これにより、Rolestatecaretaker とそのオブジェクトが使用する識別インターフェイス Memento が外部に提供されます。このようにして、Gamerole クラスは、RoleStateMemento のすべてのインターフェイスを認識しますが、他のオブジェクトは、識別インターフェイス Memento によって公開されるインターフェイスのみを認識するため、カプセル化タイプが維持されます。クラス図は次のとおりです。
この UML クラス図を使用して、ブラック ボックス メモ パターンの例を実装します。
メモインターフェイス
package com.example.deesign_patterns.memento.black_box;
//备忘录接口,对外提供窄接口
public interface Memento {
}
ゲームのキャラクター
package com.example.deesign_patterns.memento.black_box;
//游戏角色类(属于发起人角色)
public class GameRole {
private int vit;//生命力
private int atk;//攻击力
private int def;//防御力
//初始化内部状态
public void initState(){
this.vit=100;
this.atk=100;
this.def=100;
}
//战斗方法
public void fight(){
this.vit=0;
this.atk=0;
this.def=0;
}
//保存角色状态功能
public Memento saveState(){
return new RoleStateMemento(vit,atk,def);
}
//恢复角色状态
public void recoverState(Memento memento){
RoleStateMemento roleStateMemento= (RoleStateMemento) memento;
//将备忘录对象中存储的状态赋值给当前对象的成员
this.vit=roleStateMemento.getVit();
this.atk=roleStateMemento.getAtk();
this.def=roleStateMemento.getDef();
}
//展示状态功能
public void stateDisplay(){
System.out.println("角色生命力:"+vit);
System.out.println("角色攻击力:"+atk);
System.out.println("角色防御力:"+def);
}
public int getVit() {
return vit;
}
public void setVit(int vit) {
this.vit = vit;
}
public int getAtk() {
return atk;
}
public void setAtk(int atk) {
this.atk = atk;
}
public int getDef() {
return def;
}
public void setDef(int def) {
this.def = def;
}
//声明一个内部类
private class RoleStateMemento implements Memento{
private int vit;//生命力
private int atk;//攻击力
private int def;//防御力
public RoleStateMemento() {
}
public RoleStateMemento(int vit, int atk, int def) {
this.vit = vit;
this.atk = atk;
this.def = def;
}
public int getVit() {
return vit;
}
public void setVit(int vit) {
this.vit = vit;
}
public int getAtk() {
return atk;
}
public void setAtk(int atk) {
this.atk = atk;
}
public int getDef() {
return def;
}
public void setDef(int def) {
this.def = def;
}
}
}
メモオブジェクト管理オブジェクト
package com.example.deesign_patterns.memento.black_box;
//备忘录对象管理对象
public class RoleStateCaretaker {
//声明Memento类型的变量
private Memento memento;
public Memento getMemento() {
return memento;
}
public void setMemento(Memento memento) {
this.memento = memento;
}
}
テストクラス
package com.example.deesign_patterns.memento.black_box;
//测试类
public class Client {
public static void main(String[] args) {
System.out.println("-----------大战boos前-------------");
//创建游戏角色对象
GameRole gameRole=new GameRole();
gameRole.initState();
gameRole.stateDisplay();
//将该游戏角色内部状态进行备份
//创建管理者对象
RoleStateCaretaker roleStateCaretaker=new RoleStateCaretaker();
roleStateCaretaker.setMemento(gameRole.saveState());
System.out.println("-----------大战boos后-------------");
//损耗严重
gameRole.fight();
gameRole.stateDisplay();
System.out.println("-----------恢复之前的状态-------------");
gameRole.recoverState(roleStateCaretaker.getMemento());
gameRole.stateDisplay();
}
}
利点:
- 状態を復元するメカニズムを提供します。ユーザーは必要に応じて、データを特定の過去の状態に簡単に復元できます。
- 内部状態のカプセル化を実装しました。この状態情報は、それを作成した作成者以外の他のオブジェクトからはアクセスできません。
- 簡素化された開始人間。イニシエーターは、内部状態の個別のバックアップを管理および保存する必要がなく、すべての状態情報はメモに保存され、マネージャーによって管理されるため、単一責任の原則と一致します。
欠点:
- 資源の消費量が多い。保存すべき内部状態情報が多すぎる場合、または保存する頻度が非常に高い場合は、比較的大きなメモリ リソースを占有します。