前篇:【自然框架】——頁面基類與設計模式(一)橋接模式
橋接模式的補充:(下面的一段是橋接模式裡後補充的一段,橋接模式的乙個小結)
什麼是交接模式?引用《大話設計模式》裡的定義:
橋接模式(bridge):將抽象部分和他的實現部分分離,使他們都可以獨立的變化。(p229)
小菜:「我覺得交接模式所說的『將抽象部分和他的實現部分分離』,還是不好理解,我的理解就是實現系統有多個角度分類,每一種分類都有可能有變化,那麼就把這種多角度分離出來讓他們獨立變化,減少他們之間的耦合。」
這個就是作者(程杰)的理解吧,這個解釋夠白話的了,不過我還想說一下我的更加白話的理解,呵呵。大家看看對不對。
我的理解就是:有兩套或者多套獨立的「多型系統」,他們可以各自獨立的變化(繼承),互不干擾。然後選擇一套系統作為容器,在這個容器裡定義其他系統的例項或者藉口,通過這種關係(組合/聚合)把兩套或者多套系統結合起來,配合工作。組合/聚合就好像一座橋梁一樣把這些系統結合在一起,所以就叫做橋接模式了。
就好比我的這個例子裡面,頁面基類就是一套「多型系統」,他可以派生出列表頁面基類、表單頁面基類等,把頁面基類作為容器,在其內部定義資料訪問函式庫的例項,定義當前登入人資訊的例項。而資料訪問函式庫還可以自行派生出sqlclient的訪問類、oledb的訪問類,他們是獨立的「多型系統」互不干擾。頁面基類如何變化不需要考慮資料訪問的問題,資料訪問函式庫如何變化也不用考慮有多少種頁面。這就是所謂的減少耦合吧。
如果我們在頁面基類裡要做一些事情,需要制定一下執行順序,而且有一些處理方法是公用的,但是有一些處理的方式又不一樣,這時候就比較適合採用模板模式了。
比如我們在頁面基類裡override 一下oninit(eventargs e),在這裡制定一下執行順序,然後定義幾個虛函式(virtual)。**如下:
//////
提取url裡面的引數,驗證引數
//////
protected
override
void
oninit(eventargs e)
}setfunctionid()的**,其他**略。
//////
設定functionid。
///protected
virtual
void
setfunctionid()
#endregion
}這樣子類就繼承了基類的執行順序,然後如果有不一樣的驗證方式,那麼就override一下就可以了。
這樣做的好處就是,把共用的東西放到父類,子類只需要關注不一樣的地方。同時也強制了編寫規範,基類是寫好的,大家不能隨便修改,如果有不同的需求,可以去改子類(override),不必去改基類,這樣也遵守了開放封閉原則。
同理,列表頁面基類也採用了模板模式。
在自然框架裡面列表頁面裡需要使用分頁控制項、查詢控制項、資料顯示控制項、操作按鈕組這幾個控制項,那麼給這些控制項設定屬性值的操作,和他們之間的關聯關係就可以放在列表頁面基類裡去做。**如下:
//////
在 oninit 事件裡面設定各個自定義控制項的屬性和關聯
//////
protected
override
void
oninit(eventargs e)
雖然大多數列表頁面都可以這麼設定,但是也不排除特殊需求,如果又不一樣的需求的話,那麼就可以在子類裡面通過override的方式來實現自己的特殊需求。
還是那句話,把共用的放在基類裡面,子類只關心不同點即可。
模板模式的定義:
還是引用《大話設計模式》裡的定義。
模板方法模式:定義乙個操作中的演算法的骨架,而將一些步驟延遲到子類中。模版方法可以使得子類可以不修改乙個演算法的結構既可以重定義該演算法的某些特定步驟。【p96】
當然我這裡說的只是模板模式的一種形式的應用,除了這種形式的用法外還有很多種形式的用法。
白天不能上網,被遮蔽了,所以白天就不能及時回覆了,晚上在回覆。
新聞頻道:2023年中國伺服器作業系統市場分析
個人主頁
新聞社群
博問快閃儲存器
知識庫
框架與設計模式
框架與設計模式 一 概念 框架 framework 是整個或部分系統的可重用設計,表現為一組抽象構件及構件例項間互動的方法 另一種定義認為,框架是可被應用開發者定製的應用骨架。前者是從應用方面而後者是從目的方面給出的定義。設計模式 design pattern 是一套被反覆使用 多數人知曉的 經過分...
設計模式與程式框架
什麼是模式 模式,即pattern。其實就是解決某一類問題的方 你把解決某類問題的方法總結歸納到理論高度,那就是模式。alexander給出的經典定義是 每個模式都描述了乙個在我們的環境中不斷出現的問題,然後描述了該問題的解決方案的核心。通過這種方式,你可以無數次地使用那些已有的解決方案,無需在重複...
基類 抽象類 設計模式 類介面卡
設計模式 介面卡模式 之類適配模式 利用mvp模式寫了乙個demo 乙個inte ce iview 乙個沒有實現inte ce的抽象類 但裡面含有該介面同名同引數同返回值的方法 乙個抽象類既繼承了上面的抽象類也實現了介面iview但是介面裡面的方法並沒有在該類中實現 而是在沒有實現inte ce的抽...