备忘录模式实现多次撤销

改进课堂上的“用户信息操作撤销”实例,使得系统可以实现多次撤销(可以使用HashMap、ArrayList等集合数据结构实现)。

Java代码

Caretaker

 

import java.util.ArrayList;
import java.util.List;

//负责人
public class Caretaker {

    private Memento memento;
    private List<Memento> mens=new ArrayList<Memento>();
    public Memento getMemento()
    {
        memento=mens.get(mens.size()-1);
        mens.remove(mens.size()-1);
        return memento;
    }
    public void setMemento(Memento memento)
    {
        this.memento=memento;
        mens.add(memento);
    }
}

 

Memento

//备忘录

class Memento
{
    private String account;
    private String password;
    private String telNo;
    
    public Memento(String account,String password,String telNo)
    {
        this.account=account;
        this.password=password;
        this.telNo=telNo;
    }
    public String getAccount()
    {
        return account;
    }
    
    public void setAccount(String account)
    {
        this.account=account;
    }

    public String getPassword()
    {
        return password;
    }
    
    public void setPassword(String password)
    {
        this.password=password;
    }
    
    public String getTelNo()
    {
        return telNo;
    }
        
    public void setTelNo(String telNo)
    {
        this.telNo=telNo;
    }
}

UserInfoDtD

//用户信息
class UserInfoDTO
{
    private String account;
    private String password;
    private String telNo;
    
    public String getAccount()
    {
        return account;
    }
    
    public void setAccount(String account)
    {
        this.account=account;
    }

    public String getPassword()
    {
        return password;
    }
    
    public void setPassword(String password)
    {
        this.password=password;
    }
    
    public String getTelNo()
    {
        return telNo;
    }
    
    public void setTelNo(String telNo)
    {
        this.telNo=telNo;
    }
        
    public Memento saveMemento()
    {
        return new Memento(account,password,telNo);
    }
    
    public void restoreMemento(Memento memento)
    {
        this.account=memento.getAccount();
        this.password=memento.getPassword();
        this.telNo=memento.getTelNo();
    }
    
    public void show()
    {
        System.out.println("Account:" + this.account);
        System.out.println("Password:" + this.password);
        System.out.println("TelNo:" + this.telNo);        
    }
}

Client

public class Client
{
    public static void main(String a[])
    {
    UserInfoDTO user=new UserInfoDTO();
    Caretaker c=new Caretaker();
    
    user.setAccount("zhangsan");
    user.setPassword("123456");
    user.setTelNo("13000000000");
    System.out.println("状态一:");
    user.show();
    c.setMemento(user.saveMemento());//保存备忘录
    System.out.println("---------------------------");

    user.setPassword("111111");
    user.setTelNo("13100001111");
    System.out.println("状态二:");    
    user.show();
    c.setMemento(user.saveMemento());//保存备忘录
    System.out.println("---------------------------");
        
    user.setPassword("1ewe");
    user.setTelNo("13123251331");
    System.out.println("状态三:");    
    user.show();
    c.setMemento(user.saveMemento());//保存备忘录
    System.out.println("---------------------------");
    
//    user.restoreMemento(c.getMemento());//从备忘录中恢复
//    System.out.println("回到状态三:");
//    user.show();
//    System.out.println("---------------------------");
    user.restoreMemento(c.getMemento());//已经是状态三,不需要恢复,因此丢掉
    user.restoreMemento(c.getMemento());//从备忘录中恢复
    System.out.println("回到状态二:");
    user.show();
    System.out.println("---------------------------");
    user.restoreMemento(c.getMemento());//从备忘录中恢复
    System.out.println("回到状态一:");
    user.show();
    System.out.println("---------------------------");
    }
}

 

 

 c++代码

#include<iostream>
#include<string>
#include<list>
using namespace std;
//备忘录

class Memento
{
private: string account;
         string password;
         string telNo;

public: Memento(string account, string password, string telNo)
    {
        this->account = account;
        this->password = password;
        this->telNo = telNo;
    }
       string getAccount()
    {
        return account;
    }

      void setAccount(string account)
    {
        this->account = account;
    }

      string getPassword()
    {
        return password;
    }

      void setPassword(string password)
    {
        this->password = password;
    }

    string getTelNo()
    {
        return telNo;
    }

     void setTelNo(string telNo)
    {
        this->telNo = telNo;
    }
};

//负责人
class Caretaker {

private: Memento *memento;
         list<Memento*> mens;
public: Memento *getMemento()
    {
        memento = mens.back();
        mens.pop_back();
        
        return memento;
    }
       void setMemento(Memento *memento)
    {
        this->memento = memento;
        mens.push_back(memento);
    }
};
//用户信息
class UserInfoDTO
{
private:string account;
        string password;
        string telNo;

public: string getAccount()
    {
        return account;
    }

        void setAccount(string account)
    {
        this->account = account;
    }

       string getPassword()
    {
        return password;
    }

       void setPassword(string password)
    {
        this->password = password;
    }

       string getTelNo()
    {
        return telNo;
    }

      void setTelNo(string telNo)
    {
        this->telNo = telNo;
    }

      Memento *saveMemento()
    {
        return new Memento(account, password, telNo);
    }

      void restoreMemento(Memento *memento)
    {
        this->account = memento->getAccount();
        this->password = memento->getPassword();
        this->telNo = memento->getTelNo();
    }

      void show()
    {
        cout<<"Account:" << this->account<<endl;
        cout<<"Password:" << this->password<<endl;
        cout<<"TelNo:" <<this->telNo<<endl;
    }
};
int main(){
    UserInfoDTO *user = new UserInfoDTO();
    Caretaker *c = new Caretaker();

    user->setAccount("zhangsan");
    user->setPassword("123456");
    user->setTelNo("13000000000");
    cout<<"状态一:"<<endl;
    user->show();
    c->setMemento(user->saveMemento());//保存备忘录
    cout<<"---------------------------"<<endl;

    user->setPassword("111111");
    user->setTelNo("13100001111");
    cout<<"状态二:"<<endl;
    user->show();
    c->setMemento(user->saveMemento());//保存备忘录
    cout<<"---------------------------"<<endl;

    user->setPassword("1ewe");
    user->setTelNo("13123251331");
    cout<<"状态三:"<<endl;
    user->show();
    c->setMemento(user->saveMemento());//保存备忘录
    cout<<"---------------------------"<<endl;

    //    user.restoreMemento(c.getMemento());//从备忘录中恢复
    //    System.out.println("回到状态三:");
    //    user.show();
    //    System.out.println("---------------------------");
    user->restoreMemento(c->getMemento());//已经是状态三,不需要恢复,因此丢掉
    user->restoreMemento(c->getMemento());//从备忘录中恢复
    cout<<"回到状态二:"<<endl;
    user->show();
    cout<<"---------------------------"<<endl;
    user->restoreMemento(c->getMemento());//从备忘录中恢复
    cout<<"回到状态一:"<<endl;
    user->show();
    cout<<"---------------------------"<<endl;
}

 

posted @ 2021-11-09 09:04  好吗,好  阅读(146)  评论(0)    收藏  举报