实验 20:备忘录模式
实验 20:备忘录模式
本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:
1、理解备忘录模式的动机,掌握该模式的结构;
2、能够利用备忘录模式解决实际问题。
[实验任务一]:多次撤销
改进课堂上的“用户信息操作撤销”实例,使得系统可以实现多次撤销(可以使用HashMap、ArrayList等集合数据结构实现)。
实验要求:
1. 提交源代码;
JAVA
package rjsj.no20;
public class Client {
public static void main(String[] args) {
User user = new User();
Caretaker caretaker = new Caretaker();
user.setId("20193288");
user.setPassword("123456");
caretaker.setMemo(user.saveState());
System.out.println("״̬һ");
user.show();
System.out.println("************************************************************");
user.setId("20193288");
user.setPassword("qwerasdfzxcv");
caretaker.setMemo(user.saveState());
System.out.println("״̬¶þ");
user.show();
System.out.println("************************************************************");
user.setId("20183288");
user.setPassword("66666666");
caretaker.setMemo(user.saveState());
System.out.println("״̬Ƚ");
user.show();
System.out.println("************************************************************");
System.out.println("ְ²½³·Ϻ²ٗ÷£º");
System.out.println("»ָ´µ½״̬¶þ");
user.restoreState(caretaker.getMemo());
user.show();
System.out.println("************************************************************");
System.out.println("»ָ´µ½״̬һ");
user.restoreState(caretaker.getMemo());
user.show();
}
}
package rjsj.no20;
public class Memo {
private String id;
private String password;
public Memo(String id, String password) {
this.id = id;
this.password = password;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
package rjsj.no20;
public class User {
private String id;
private String password;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Memo saveState(){
return new Memo(id,password);
}
public void restoreState(Memo m){
this.id = m.getId();
this.password = m.getPassword();
}
public void show(){
System.out.println("id:" + this.id);
System.out.println("password:" + this.password);
}
}
package rjsj.no20;
import java.util.ArrayList;
import java.util.List;
public class Caretaker {
private List<Memo> list = new ArrayList<>();
public void setMemo(Memo m){
list.add(m);
}
public Memo getMemo(){
Memo m = list.get( list.size() - 2 );
list.remove( list.size() - 2 );
return m;
}
}
C++
#include<iostream>
#include <list>
using namespace std;
class Memento {
private:
string account;
string password;
public:
string getAccount() {
return account;
}
void setAccount(string account) {
this->account = account;
}
string getPassword() {
return password;
}
void setPassword(string password) {
this->password = password;
}
Memento(string account, string password) {
this->account = account;
this->password = password;
}
};
class UserInfoDTO {
private:
string account;
string password;
public:
string getAccount() {
return account;
}
void setAccount(string account) {
this->account = account;
}
string getPassword() {
return password;
}
void setPassword(string password) {
this->password = password;
}
Memento* saveMemento() {
return new Memento(account,password);
}
void restoreMemento(Memento *memento) {
this->account=memento->getAccount();
this->password=memento->getPassword();
}
void show() {
cout<<"Account:"<<this->account<<endl;
cout<<"Password:"<<this->password<<endl;
}
};
class Caretaker {
private:
list<Memento*> ll;
public:
Memento* getMemento() {
ll.pop_front();
Memento* mm=ll.front();
return mm;
}
void setMemento(Memento *memento) {
ll.push_front(memento);
}
};
int main(){
UserInfoDTO *user=new UserInfoDTO();
Caretaker *c=new Caretaker();
user->setAccount("张三");
user->setPassword("123456");
cout<<"状态一:"<<endl;
user->show();
c->setMemento(user->saveMemento());
cout<<"-----------------------------"<<endl;
user->setAccount("李四");
user->setPassword("lisi666");
cout<<"状态二:"<<endl;
user->show();
c->setMemento(user->saveMemento());
cout<<"-----------------------------"<<endl;
user->setAccount("王五");
user->setPassword("88888888");
cout<<"状态三:"<<endl;
user->show();
c->setMemento(user->saveMemento());
cout<<"-----------------------------"<<endl;
user->restoreMemento(c->getMemento());
cout<<"回到状态二:"<<endl;
user->show();
cout<<"-----------------------------"<<endl;
user->restoreMemento(c->getMemento());
cout<<"回到状态一:"<<endl;
user->show();
cout<<"-----------------------------"<<endl;
}
运行结果:
2. 注意编程规范。