21、備忘錄模式(設(shè)計(jì)模式筆記)

一、場(chǎng)景

  • 錄入大批人員資料。正在錄入當(dāng)前資料時(shí),發(fā)現(xiàn)上一個(gè)錄錯(cuò)了,此時(shí)需要回復(fù)上一個(gè)資料,再進(jìn)行修改
  • word文檔編輯時(shí),忽然電腦死機(jī)了,再打開(kāi)時(shí),可以看到word提示你回復(fù)到以前的文檔
  • 管理系統(tǒng)中,公文撤回功能。公文發(fā)送出去后,想車回來(lái)

二、核心

就是保存某個(gè)對(duì)象內(nèi)部狀態(tài)的拷貝,這樣以后就可以將該對(duì)象回復(fù)到原先的狀態(tài)

三、結(jié)構(gòu)

  • 源發(fā)器類Originatot
  • 備忘錄類Memento
  • 負(fù)責(zé)人類CareTaker

Emp.java

package cn.itcast.day253.memento;
//源發(fā)器類
public class Emp {

    private String name ;
    private int age ;
    private double salary;
    
    //備忘操作,并返回備忘錄對(duì)象
    public EmpMemento memento(){
        return new EmpMemento(this);
    }
    
    //數(shù)據(jù)回復(fù),回復(fù)成指定備忘錄的值
    public void recovery(EmpMemento mmt){
        this.name = mmt.getName();
        this.age = mmt.getAge();
        this.salary = mmt.getSalary();
    }

    public Emp(String name, int age, double salary) {
        this.name = name;
        this.age = age;
        this.salary = salary;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public double getSalary() {
        return salary;
    }
    public void setSalary(double salary) {
        this.salary = salary;
    }
}

EmpMemento.java

package cn.itcast.day253.memento;
//備忘錄類:保存源發(fā)器類中的相關(guān)信息
public class EmpMemento {
    private String name ;
    private int age ;
    private double salary;
    
    public EmpMemento(Emp e){
        this.name = e.getName();
        this.age = e.getAge();
        this.salary = e.getSalary();
    }
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public double getSalary() {
        return salary;
    }
    public void setSalary(double salary) {
        this.salary = salary;
    }
}

CareTaker.java

package cn.itcast.day253.memento;
//負(fù)責(zé)人類:負(fù)責(zé)管理備忘錄對(duì)象
public class CareTaker {
    
    private EmpMemento memento;//當(dāng)然這里我們也可以是一個(gè)容器,這樣就可以存儲(chǔ)很多個(gè)備忘點(diǎn),最好是一個(gè)棧

    public EmpMemento getMemento() {
        return memento;
    }

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

說(shuō)明:一個(gè)源發(fā)器類用來(lái)保存我們操作對(duì)象的信息,而備忘錄類就是保存我們操作過(guò)程中的一些狀態(tài)信息,同時(shí)有一個(gè)負(fù)責(zé)人類專門來(lái)管理備忘錄類,用來(lái)撤銷等操作。

Client.java

package cn.itcast.day253.memento;
public class Client {
    public static void main(String[] args) {
        CareTaker taker = new CareTaker();

        Emp emp = new Emp("yj", 26, 12000);
        System.out.println("第一次:" + emp.getName() + ",年齡:" + emp.getAge()
                + ",工資:" + emp.getSalary());
        
        taker.setMemento(emp.memento());//備份
        
        emp.setAge(27);
        emp.setSalary(21000);
        
        System.out.println("第二次:" + emp.getName() + ",年齡:" + emp.getAge()
                + ",工資:" + emp.getSalary());
        
        emp.recovery(taker.getMemento());//恢復(fù)
        
        System.out.println("第三次:" + emp.getName() + ",年齡:" + emp.getAge()
                + ",工資:" + emp.getSalary());
    }
}

四、開(kāi)發(fā)中常見(jiàn)的場(chǎng)景

  • 棋類游戲中,悔棋
  • 普通軟件中,撤銷操作
  • 數(shù)據(jù)庫(kù)軟件中,事物管理中的回滾操作
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容