iOS設計模式--備忘錄設計模式與命令設計模式

何爲備忘錄模式?ios

    在響應某些事件時,應用程序須要保存自身的狀態,好比當用戶保存文檔或程序退出時。例如,遊戲退出以前,可能須要保存當前會話的狀態,如遊戲等級、敵人數量、可用武器的種類等。遊戲再次打開時,玩家能夠從離開的地方接着玩。不少時候,保存程序的狀態真的不須要什麼特別巧妙的方法。任何簡單有效的方法均可以,可是同時,保存信息應該只對原始程序有意義。原始程序應該是可以解碼它所保存文檔中的信息的惟一實體。這就是備忘錄模式應用於遊戲、文字處理等程序的軟件設計中的方式,這些程序須要保存當前上下文的複雜狀態的快照並在之後恢復。git

    備忘錄模式:在不破壞封裝的前提下,捕獲一個對象的內部狀態,並在該對象以外保存這個狀態。這樣之後就可將該對象恢復到原先的保存狀態。github

什麼時候使用備忘錄模式?網絡

    當同時知足如下兩個條件時,應當考慮使用這一模式:架構

    @:須要保存一個對象(或某部分)在某一個時刻的狀態,這樣之後就能夠恢復到先前的狀態。框架

    @:用於獲取狀態的接口會暴漏實現的細節,須要將其隱藏起來。函數

Cocoa Touch框架中的備忘錄模式編碼

    Cocoa Touch框架在歸檔、屬性列表序列化和核心數據中採用了備忘錄模式。Cocoa的歸檔是對對象及其屬性還有同其餘對象間的關係進行編碼,造成一個文檔,該文檔既能夠保存於文件系統,也能夠在進程或網絡間傳送。對象與其餘對象的關係被看作對象圖的網絡。歸檔過程把對象保存爲一種與架構無關的字節流,保持對象的標識以及對象之間的關係。對象的類型也同數據一塊兒保存。從字節流解碼出來的對象一般用與對象編碼時相同的類型進行實例化。spa

    若是想歸檔一個對象,不少時候咱們是考慮保存程序的狀態。在模型-視圖-控制器範式中,程序的狀態一般由模型對象來進行維護。咱們把模型對象編碼到文檔,而後再對其解碼讀回來。在運行時使用NSCoder對象進行編碼與解碼操做。NSCoder自己是個抽象類。蘋果公司建議經過NSCoder的具體類NSKeyArchiver和NSKeyedUnarchiver,使用基於鍵的歸檔技術。被編碼與解碼的對象必須遵照NSCoding協議並實現如下方法:設計

- (void)encodeWithCoder:(NSCoder *)aCoder;
- (id)initWithCoder:(NSCoder *)aDecoder;


何爲命令模式?

    命令對象封裝瞭如何對目標執行命令的信息,所以客戶端或調用者沒必要了解目標的任何細節,卻仍能夠對它執行任何已有的操做。經過把請求封裝成對象,客戶端能夠把參數化並置入隊列或日誌中,也可以支持可撤銷的操做。命令對象將一個或多個動做綁定到特定的接收器。命令模式消除了做爲對象的動做和執行它的接收器之間的綁定。

    命令模式:將請求封裝爲一個對象,從而可用不一樣的請求對客戶進行參數化,對請求隊列或記錄請求日誌,以及支持可撤銷的操做。

什麼時候使用命令模式?

    在如下情形,天然會考慮使用這一模式。

    @:想讓應用程序支持撤銷與恢復。

    @:想用對象參數化一個動做以執行操做,並用不一樣的命令對象來代替回調函數。

    @:想要在不一樣時刻對請求進行指定、排列和執行。

    @:想記錄修改日誌,這樣在系統故障時,這些修改能夠在後來重作一遍。

    @:想讓系統支持事務,事務封裝了對數據的一系列修改,事務能夠建模爲命令對象。

在Cocoa Touch框架中使用命令模式:

    NSInvocation、NSUndoManage和Target-Action機制是框架中對這個模式的典型引用。


如何使用備忘錄模式與命令模式,詳見下面這篇文章:

http://blog.jobbole.com/48179/ (譯文)  http://www.raywenderlich.com/46988/ios-design-patterns (原文)

本篇文章的demo連接地址:

https://guoshimeihua@github.com/guoshimeihua/MemoryAndCommandDemo.git

本篇文章備忘錄模式與命令模式就寫到這裏了。

相關文章
相關標籤/搜索