为什么说Memento在不违反封装的情况下完成工作,而我可以实现简单的方法而且不违反封装? 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);
}
上面的示例代码完美无缺,但为什么我们需要纪念品才能轻松完成?我不知道上面的实现在哪些方面违反了封装...
的摘要
上述方法是否违反了封装?如果没有,那么纪念品的目的是什么?允许多次撤消?虽然上面的实现不允许多次撤消,但也可以在不应用纪念的情况下完成。
答案 0 :(得分:1)
在您的方法中,sCopy
引用的实例会公开所有可用的setter。如果它们用于更改值,则撤消将无法正常工作。这违反了封装,因为撤消的正确性取决于您班级的客户。
memento对象不会暴露任何(变异)方法,并且总是可以安全地用于完全恢复对象的状态。
答案 1 :(得分:0)
上述方法是否违反了封装?
可能。我们会看到。
首先,选择违反封装的some definition:
拥有getter和setter本身并不会破坏封装。 破解封装有什么吸气剂和定位器 每个数据成员(每个字段,在java术语中)。那是一步之遥 从使所有数据成员公开。
是你的情况吗?您在学生中有一些getter和setter,可能会暴露您的应用程序中不需要的一些方法,例如gender
或name
。即使它们是必要的,将来也可以在学生中出现新的领域,你的解决方案可以在不违反封装的情况下继续工作。
允许多次撤消?
这是其中一个优势。
虽然上面的实现不允许多次撤消,但也可以在不应用memento的情况下完成。
是的,但可能违反了封装。