备忘录模式实现多次撤销
改进课堂上的“用户信息操作撤销”实例,使得系统可以实现多次撤销(可以使用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;
}