>Java >java지도 시간 >Java 메모 패턴을 활용하여 객체 상태를 저장하고 복원하는 방법은 무엇입니까?

Java 메모 패턴을 활용하여 객체 상태를 저장하고 복원하는 방법은 무엇입니까?

PHPz
PHPz앞으로
2023-05-08 20:07:39938검색

소개

메멘토 패턴은 캡슐화를 파괴하지 않고 객체의 내부 상태를 캡처하고 저장할 수 있도록 하는 동작 설계 패턴이며, 나중에 객체를 이전 상태로 복원할 수 있습니다. 이 패턴의 핵심은 Memento 클래스입니다. Java에서 Memento 패턴은 Memento 클래스를 정의하여 구현할 수 있습니다. Memento 클래스에는 일반적으로 저장된 객체의 내부 상태를 저장하는 하나 이상의 비공개 필드가 포함되어 있습니다. 또한 이러한 필드를 가져오고 설정하는 공개 메서드를 제공합니다. 원본 개체는 메모 클래스를 사용하여 메모를 생성하고 이를 기록에 저장할 수 있습니다. 개체의 상태를 복원해야 할 경우 원본 개체는 기록에서 메모를 가져오고 메모를 사용하여 상태를 복원하세요.

메모 모드에서는 일반적으로 다음 세 가지 역할이 관련됩니다.

    Originator(개시자): 메모를 생성하기 위한 인터페이스를 제공합니다.
  • Memento(메모): Originator의 필요에 따라 내부 상태를 저장하는 데 사용되는 객체입니다.
  • Caretaker(관리자): 메모를 저장하고 필요할 때 복구를 위해 Originator에 제공하는 역할을 담당합니다. .
  • Java에서 메모 모드를 구현할 때 일반적으로 위의 세 가지 역할이 관련됩니다. Originator와 Memento가 필요하며 Caretaker는 실제 필요에 따라 구현 여부를 선택할 수 있습니다.

Implementation

게임이 있다고 가정합니다. 캐릭터 클래스 역할에는 공격(공격력), 방어(방어력), HP(체력)의 세 가지 속성이 있습니다. 이제 캐릭터의 상태를 저장하고 필요할 때 캐릭터의 상태를 복원할 수 있는 메모 모드를 구현해야 합니다. Memo Class

@Data
public class Memento {
    /**
     * 攻击力
     */
    private int attack;
    /**
     * 防御力
     */
    private int defense;
    /**
     * 生命值
     */
    private int hp;
    public Memento(int attack, int defense, int hp) {
        this.attack = attack;
        this.defense = defense;
        this.hp = hp;
    }
}

Initiate Human

@Data
public class Role {
    /**
     * 攻击力
     */
    private int attack;
    /**
     * 防御力
     */
    private int defense;
    /**
     * 生命值
     */
    private int hp;
    public Role(int attack, int defense, int hp) {
        this.attack = attack;
        this.defense = defense;
        this.hp = hp;
    }
    /**
     * 将当前对象储存值Memento中
     * @return
     */
    public Memento save(){
        return new Memento(attack,defense,hp);
    }
    /**
     * 从memento中获取状态;并恢复到当前状态
     * @param memento
     */
    public void restore(Memento memento){
        attack = memento.getAttack();
        defense = memento.getDefense();
        hp = memento.getHp();
    }
}

Manager Class

public class Caretaker {
    private List<Memento> mementos = new ArrayList<>();
    public void addMemento(Memento m){
        mementos.add(m);
    }
    public Memento getMemento(int index){
        return mementos.get(index);
    }
}

Test

public class Demo {
    public static void main(String[] args) {
        Role role = new Role(100,50,20);
        Caretaker caretaker = new Caretaker();
        Memento memento = role.save();
        caretaker.addMemento(memento);
        // 攻击力+10
        role.setAttack(role.getAttack()+10);
        System.out.println(JSON.toJSONString(role));
        // 恢复
        role.restore(caretaker.getMemento(0));
        System.out.println(JSON.toJSONString(role));
    }
}

이것은 메모 패턴의 완전한 예입니다. 이 예에서는 캐릭터의 공격력, 방어력을 저장하는 메모 클래스 Memento를 만듭니다. 또한 캐릭터의 상태를 저장하고 복원할 수 있는 캐릭터 클래스인 Role을 생성했으며, 마지막으로 Memento 객체를 저장하는 데 사용되는 Caretaker 클래스를 생성하여 이를 조합하여 구현했습니다.

Java 메모 패턴을 활용하여 객체 상태를 저장하고 복원하는 방법은 무엇입니까? 요약

장점

개체 상태를 저장하고 복원하여 개체 상태를 보다 유연하고 제어 가능하게 변경할 수 있습니다.

  • 이 모드는 구현이 간단하고 이해 및 사용이 쉽습니다.

  • 메모 객체가 원본 객체와 분리되어 시스템의 캡슐화가 보장됩니다.
  • 단점
  • 저장할 상태 데이터의 양이 상대적으로 많은 경우 메모 객체가 많은 양을 차지할 수 있습니다. 메모리 공간입니다.

    상태를 자주 저장해야 하는 경우 메모 객체 관리가 더 복잡해질 수 있습니다.
  • 응용 시나리오
  • 객체 상태에 대한 기록을 저장해야 합니다.

    데이터베이스의 트랜잭션 관리와 같이 객체 상태를 백업하고 복원해야 하는 시나리오
  • 예를 들어 게임 내 보관 및 재생 기능을 수행하는 동안 개체 상태의 스냅샷을 구현하는 데 필요합니다.
  • 즉, Java 메모 모드는 개체 상태가 필요한 시나리오에 적합합니다. 개발자가 객체 상태의 변경 사항을 더 잘 관리하고 시스템의 유연성과 제어 가능성을 향상시키는 데 도움이 될 수 있습니다.

위 내용은 Java 메모 패턴을 활용하여 객체 상태를 저장하고 복원하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제