2011-07-07 28 views
8

因爲我們知道紀念圖案沒有違反封裝,捕獲和外化對象的內部狀態,以後可以在不知道原始狀態的情況下回收。java.io.Serializable如何構造Memento模式?

我的問題來這裏如何java.io.Serializable在這種模式下的來,因爲當過我們序列化任何私有變量,並在同一時間書寫對象狀態的文件私人varible的價值是向世界開放和封裝似乎在這裏失敗。

+0

[關於Memento模式的維基百科文章](http://en.wikipedia.org/wiki/Memento_pattern)沒有任何「封裝」的發生。 –

+0

@Andre,請參考下面的鏈接。 http://www.javacamp.org/designPattern/ – BOSS

+0

您的參考鏈接還有一個鏈接。 http://sourcemaking.com/design_patterns/memento – BOSS

回答

4

Wikipedia article on the Memento pattern沒有提到關於封裝的任何事情,實際上,這裏給出的例子恰好捕獲了在一個Memento中的私有變量中保存的狀態。

封裝(「A 語言機制限制對某些對象的組件的訪問」)指的是你怎麼也得寫,以便代碼更改對象的內部狀態。

但是,對象的內部狀態可能是由外部輸入確定的,例如字符串的內容取決於從中讀取的文件或從網絡接收到的數據。複選框的狀態取決於用戶是否檢查過它,而類中的相應字段可能具有私人訪問權限,並且該狀態對於其他類可能是隻讀的。

通過將字段置於私人訪問權限來保護字段意味着幫助開發人員將對象的狀態保持爲一致狀態,即避免字段從該類以外的代碼設置爲不一致狀態(例如,如果字段A取決於字段B的值)。

它與'隱私'無關,因爲這個數據被認爲是祕密。當然,我們可以編寫另一個類,然後讀取序列化的專用字段,並將它們公開在不同的類中,或者甚至可以編輯序列化的文件,但我不確定從中可以獲得什麼。

+1

+1。封裝意味着一個類不允許程序中的其他實體直接訪問和修改數據/方法。如果封裝意味着總體而不是部分不透明,那麼將其私有數據成員保存到文本文件的類是什麼?違反封裝原則?事實上,這意味着所有面向對象的數據庫管理系統都會違反封裝。這會讓O-O大師們感到煩惱太多:-) – 2rs2ts

0

From Wikipedia's encapsulation article:在編程語言中的封裝被用於指兩種相關但不同的概念之一,有時它們的組合:

  • 甲語言機構用於限制到某些對象的組件的訪問。
  • 一種語言結構,便於將數據與在數據上運行的方法(或其他函數)捆綁在一起。

From the opaque object article:內容是不透明的,並且通常不解釋直到接收者通過該Cookie (或在我們的事業中,對象)數據回在稍後的時間發送者或也許另一個程序。

封裝沒有被破壞。備忘錄模式阻止看護者對象更改備忘錄對象,以便發起者可以將其用於回滾或其他實用程序。

0

我的理解是Memento模式沒有指定任何關於紀念幣/標記本身的格式/不透明度/安全性。紀念品的格式(人類可讀,完全加密或其間的任何地方)與格式本身無關。

我會爭辯說序列化(XML或二進制)是一個Memento實現的好例子。它公開對象內部的事實可能意味着它不是您項目的最佳實現。但是,它仍然是該模式的有效實現。 :)