为什么说Memento在不违反封装的情况下完成其工作,而我既可以实现简单的方法又可以在不违反封装的情况下进行工作? Memento有什么用?
我有一个示例程序,它将在用户按下保存按钮时保存学生详细信息,并在用户按下然后撤消按钮时撤消操作。
下面的示例代码是不使用Memento模式的实现:
学生.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却很容易做到呢?我看不到上面的实现在哪里封装...
摘要
以上方法是否违反封装?如果不是,那么Memento的目的是什么?允许多次撤消?尽管上面的实现不允许多次撤消,但是也可以在不应用备忘录的情况下完成。

最佳答案

在您的方法中,sCopy引用的实例公开了所有可用的设置器。如果使用它们来更改值,则撤消将无法正常工作。这违反了封装,因为撤消操作的正确性取决于类的客户端。

纪念品对象不会公开任何(变异的)方法,并且始终可以安全地用于精确还原对象的状态。

10-01 03:41