2017-06-21 52 views
1

爲什麼說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); 
    }  

示例代碼工作完美,但爲什麼我們需要紀念,同時它可以很容易地完成?我沒有看到上面執行紫羅蘭封裝的地方...

摘要
上面的方法是否違反封裝?如果不是,那麼Memento的目的是什麼?允許多個撤消?雖然上面的實現不允許多次撤消,但是也可以不使用記錄來完成。

+0

您的版本將永遠只允許一次撤銷,而備忘錄模式可以允許潛在無限的撤銷和重做。 –

+0

在您的代碼中,您只能撤銷一個單一版本(最後使用scopy變量)。使用Memento,您可以保存多種版本的學生並撤消每個版本。 – Dherik

+0

現在我們暫時不在尋找多個撤消。 Memento的意圖是恢復狀態而不違反封裝,但是這個簡單的實現也沒有違反它? – Newbie

回答

1

在你的方法中,引用sCopy的實例公開了所有可用的setter。如果它們用於更改值,則撤消操作將無法正常工作。這違反了封裝,因爲撤消的正確性取決於你的類的客戶端。

備忘錄對象不會公開任何(變異)方法,並且始終可以安全地用於完全恢復對象的狀態。

0

以上辦法是否違反封裝?

也許。我們會看到。

首先,挑的是什麼違反了封裝some definition

有getter和setter方法本身並不破壞封裝。 什麼是break封裝是爲每個數據成員(java領域中的每個字段)都有一個getter和setter,用於 。這距離公開所有數據成員僅有一步之遙 。

是你的情況嗎?你在學生中有一些getter和setter,可能會暴露一些你的應用中沒有必要的方法,如gendername。即使他們是必要的,將來也可能會在學生中出現新的領域,並且您的解決方案在不違反封裝的情況下無法工作。

允許多次撤消?

這是優點之一。

儘管上面的實現不允許多次撤銷,但是也可以不應用記事。

是的,但可能違反封裝。

相關問題