實現Undo/Redo以及格式刷的分析

在網上看了備忘錄模式實現undoredo,實際上也沒必要理解得很複雜,其實算是比較好做的東西。UndoRedo的核心就在於要保存對象的屬性,以便還原,兩個道理都是一樣的。

 

實現此功能的必要技術(這裏的必要只是說掌握了實現起來很容易):自定義特性,反射,數據結構中的棧(能用集合模擬也可以)。反射在.net中強大到我已經無語了,不懂的補下基礎。

 

撤銷刪除實現步驟:

1.需要實現UndoRedo的實體類,這個自己寫,什麼都可以,複雜簡單都可以,反正是通用的,當然你撤銷/重複的必須是屬性,當然方法也可以,這個比較麻煩就不介紹了,自己也是見過但是沒用過。

 

2.寫自定義特性類,不用複雜,能識別就可以了,比如只需要一個名字屬性(寫成構造函數即可,當然可以加很多別的),在支持Undo/Redo的屬性上加上這個特性,自定義特性的構造函數名就用所加屬性的名字即可,如下:

 

3.做一個類,存放操作對象的引用,所修改的值,修改前的值,修改的屬性名。(怎麼做?簡單,寫個監聽屬性改變的事件就可以了,不會的去看事件)

 

4.做到這裏還差什麼呢?基本上拿着這些都能實現了吧,不過咱們要的不是一步操作,當然還需要一個棧來存儲,前面說了,模擬棧也可以,這個相當簡單了,用泛型集合很容易實現,你問我放什麼?當然是第三步存放屬性類的對象了,當然最重要的是別忘了還要在弄一個集合來存放這個集合對象(一次改變多個對象的情況肯定是有的)

 

5.到這裏真的什麼都不差了,反射裏PropertyInfo中的SetValue,GetValue方法一運用,OK了?隨便你UndoRedo

 

補充一下格式刷的說明

既然上面都實現了嘛,格式刷就是小菜一碟了,存放屬性的對象有了,存放這個對象的集合有了,那還缺啥,什麼都不缺了,想辦法取出來所需要的屬性,刷就行了。(可能還有些具體工作,實現方法很多,看自己了)

舉一個例:能夠支持格式刷的當然是有同種屬性的對象,只要在對象的類頭上加上自定義屬性,表明這個類支持什麼樣的屬性,後面的工作就簡單了。

 

難得寫一篇博客,也就是提供一個思路,其實想清楚了實現很簡單的,網上的代碼很多人可能突然看不懂,看看我寫的流水賬也許有助於理解,明天還得上班,就先寫到這裏吧。歡迎大家批評指正,夜深了腦子不清楚,以後我會盡量補充完善

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章