本篇部落格記錄了我在工作過程中的一個設計單元。
需求
圖1 界面原型
使用者可以指定對對象的某屬性進行某個比較操作。
設計-總體結構
圖2 總體結構
看上去會有點暈?懶了一點,就全畫一起了。 :o)
中間的接口就是整個結構的核心所在,下面會詳細解釋:
第一組接口:設計比對概念
首先,明确比對的概念,這個概念是與gix4應用無關的。 一個是可以被比對的對象,另一個則是主動比對者。如下:
第二組接口:設計過濾規則
動态規則是需要存儲到資料庫中的,但是由于它的形式十分靈活,是以這裡選用xml這種半結構化的資料格式來存儲規則内容,最後再序列化存儲到資料庫中。這種解決方法适用于一些小型的、結構變化性大的對象,如下:
ifilterrule是這三個中最重要的接口。表示一個動态的過濾規則。在gix4中,它可以是一個簡單的規則:
“對象的name屬性應該包含‘***’”
也可以是由各種簡單規則複合而成,如:
“對象的name屬性應該包含‘***’” and “對象的name屬性應該滿足正規表達式‘***’” and “對象的amount屬性應該大于‘0’”
這裡ifilterrule接口及其子類的設計方法,類型“表達式樹”。(朋友說其實是解釋器模式,不過我自己也沒記住解釋器模式是什麼結構,是以不知道這裡到底是不是。) :o)
第三組接口:中繼資料-比較操作
過濾的規則是動态的,但是對于某種資料類型(string、int)進行的比較操作,卻是固定的。過濾規則則是由這些固定的操作組合而成。如:我可以對user對象的name屬性(string)進行是否以某字元串開頭的判斷,可以定義如下:name beginwith “王”,這裡的beginwith就是一個比較操作,它針對類型string。操作定義如下:
第三組接口:中繼資料-屬性規則
由于項目中最常使用的就是根據屬性的值來進行簡單的過濾,是以定義了一個“可比對屬性”接口。通過它,可以獲得能夠對這個屬性進行的所有操作。可以擷取到指定的可比對對象imatchable的該屬性值。實作時可以不使用反射而進行快速擷取值,加快比對速度。
到現在,最基本的接口就已經設計完成。
內建到gix4
1.外觀
子產品使用外觀模式建構facade類來降低外部使用的複雜度。
2.組裝
系統主要是比對pbs到fgqbqitem。本着“新增優于修改”的原則,不想在原有的類上修改或者、添加新的代碼,是以這裡為這兩個類分别擴充新類fgqbqitemmatch和pbsmatchtarget,并實作imatchable和imatchtarget,然後再由實作imatchable的類fgqbqitemmatch指定哪此屬性(fgqbqitemmatchproperty類)可以用于比對就行了,如下圖:
圖3 內建過程
其它-界面
有意思的是,由于這次的界面是動态的,實作過程中使用了裝飾模式以重用屬性規則編輯器。圖就不畫了,貼下代碼圖:
圖4 界面代碼
最後的界面如下:
圖5 最終界面
其它-所有代碼圖
除了界面以外,整個方案的代碼圖如下:
圖6 所有代碼
後話
做完了,感覺解決得還行。原來發的文章都沒什麼人搭理,這次真心希望多來幾個拍磚的,沒人說,就沒進步啊。嘿嘿。
另外,cnblog沒有多大的空間傳檔案,是以就不傳代碼了。如有誰需要代碼,可以留言找我。