【发布时间】:2017-11-24 16:53:24
【问题描述】:
为什么说 Memento 在不违反封装的情况下完成了它的工作,而我可以实现简单的方法但又不违反封装?备忘录有什么用?
我有一个示例程序,它将在用户按下保存按钮时保存学生详细信息,并在用户按下然后撤消按钮时撤消操作。
下面的示例代码是不使用 Memento 模式的实现:
Student.java
public class Student
{
private String name;
private String gender;
private int age;
private Contact contact;
public Student(String name, String gender, int age, Contact contact)
{
this.name = name;
this.gender = gender;
this.age = age;
this.contact = contact;
}
//getter and setter
}
Main.java
public class Main extends javax.swing.JFrame implements DocumentListener
{
private Student sCopy, student;
private void btnUndoActionPerformed(java.awt.event.ActionEvent evt)
{
txtName.setText(sCopy.getName());
txtGender.setText(sCopy.getGender());
txtAge.setText(sCopy.getAge() + "");
txtPhone.setText(sCopy.getContact().getPhoneNo());
txtEmail.setText(sCopy.getContact().getEmail());
txtAddress.setText(sCopy.getContact().getAddress());
student = sCopy;
}
private void btnSaveActionPerformed(java.awt.event.ActionEvent evt)
{
sCopy = student;
Contact c = new Contact(txtPhone.getText(), txtEmail.getText(), txtAddress.getText());
student = new Student(txtName.getText(), txtGender.getText(), Integer.parseInt(txtAge.getText()), c);
}
上面的示例代码完美运行,但为什么我们需要备忘录,而它可以很容易地完成呢?我没有看到上面的实现在哪里使封装...
总结
上述方法是否违反封装?如果不是,那么 Memento 的目的是什么?允许多次撤消?虽然上面的实现不允许多次撤销,但也可以在不应用备忘录的情况下完成。
【问题讨论】:
-
您的版本将只允许一次撤消,而备忘录模式可能允许无限次撤消和重做
-
在您的代码中,您只能撤消一个版本(最后一个版本,使用 scopy 变量)。使用 Memento,您可以保存多个学生版本并撤消每个版本。
-
我们暂时不寻找多个撤消。 Memento 的目的是在不违反封装的情况下恢复状态,但是这个简单的实现也没有违反它,对吧?
-
你从哪里读到 Memento 违反了封装?
-
@Dherik 我没有说 Memento 违反了封装。我的意思是为什么应用 memento 模式,而撤消可以通过更简单的实现来完成,并且不违反封装?
标签: java design-patterns memento