10.24
实验 20:备忘录模式
本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:
1、理解备忘录模式的动机,掌握该模式的结构;
2、能够利用备忘录模式解决实际问题。
[实验任务一]:多次撤销
改进课堂上的“用户信息操作撤销”实例,使得系统可以实现多次撤销(可以使用HashMap、ArrayList等集合数据结构实现)。
实验要求:
1. 画出对应的类图;
2. 提交源代码;
class UserInfo:
def __init__(self, name, age):
self.name = name
self.age = age
print(f"创建用户信息:姓名 - {self.name},年龄 - {self.age}")
def get_name(self):
return self.name
def set_name(self, new_name):
self.name = new_name
print(f"更新用户姓名为:{self.name}")
def get_age(self):
return self.age
def set_age(self, new_age):
self.age = new_age
print(f"更新用户年龄为:{self.age}")
def create_memento(self):
return UserInfoMemento(self.name, self.age)
def restore_from_memento(self, memento):
self.name = memento.get_name()
self.age = memento.get_age()
print(f"恢复用户信息:姓名 - {self.name},年龄 - {self.age}")
class UserInfoMemento:
def __init__(self, name, age):
self.name = name
self.age = age
def get_name(self):
return self.name
def get_age(self):
return self.age
class CareTaker:
def __init__(self):
self.memento_list = []
def add_memento(self, memento):
self.memento_list.append(memento)
def get_memento(self, index):
if 0 <= index < len(self.memento_list):
return self.memento_list[index]
return None
def remove_memento(self, index):
if 0 <= index < len(self.memento_list):
del self.memento_list[index]
class UserInfoOperation:
def __init__(self, user_info):
self.user_info = user_info
self.care_taker = CareTaker()
def update_name(self, new_name):
self.care_taker.add_memento(self.user_info.create_memento())
self.user_info.set_name(new_name)
def update_age(self, new_age):
self.care_taker.add_memento(self.user_info.create_memento())
self.user_info.set_age(new_age)
def undo(self):
last_index = len(self.care_taker.memento_list) - 1
if last_index >= 0:
memento = self.care_taker.get_memento(last_index)
if memento:
self.user_info.restore_from_memento(memento)
self.care_taker.remove_memento(last_index)
if __name__ == "__main__":
user_info = UserInfo("张三", 25)
operation = UserInfoOperation(user_info)
operation.update_name("李四")
operation.update_age(30)
operation.undo()
operation.undo()
3. 注意编程规范。
浙公网安备 33010602011771号