天天看點

模式應用:自定義比對

 本篇部落格記錄了我在工作過程中的一個設計單元。

需求

模式應用:自定義比對

圖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沒有多大的空間傳檔案,是以就不傳代碼了。如有誰需要代碼,可以留言找我。