許 俊
(四川職業(yè)技術學院計算機科學系,四川 遂寧 629000)
基于策略模式的存儲過程使用研究
許 俊
(四川職業(yè)技術學院計算機科學系,四川 遂寧 629000)
應用策略模式來研究返回數(shù)據(jù)結(jié)果集的存儲過程在前端高層模塊的使用.在策略模式設計思維下,每個存儲過程調(diào)用視為一種策略,每一種策略即是一個類,去實現(xiàn)它上層對策略家族的抽象.本文按有參和無參兩類存儲過程作詳細分析,設計類圖,并實現(xiàn).所研究的使用模式,進一步提高了系統(tǒng)的復用性、可維護性.
策略模式;數(shù)據(jù)庫;存儲過程
策略模式是定義了算法家族,封裝每一個算法,每一個算法能夠互相替換.算法家族的各個算法完成相同的操作,只不過實現(xiàn)的方式不同而已.調(diào)用它們的方式是同樣的,這樣就減少了各個算法類與調(diào)用算法的類的耦合.
策略模式的適用性是下面的范圍:多個關聯(lián)的類只是它們的操作有一些差異;稍有變異的實體使用一個算法;需要對調(diào)用者隱藏算法和數(shù)據(jù)結(jié)構(gòu).策略模式的一般類圖如圖1:
圖1 策略模式的一般類圖
Stategy:指策略,定義全體公共的接口,Context通過些接口調(diào)用 ConcreteStrategyA、ConcreteStrategyB、ConcreteStrategyC 等定義的算法.
ConcreteStrategy:具體策略,以Strategy實現(xiàn)某個具體的算法.
Context:策略相關文本.引用Strategy對象,用一個具體的策略 ConcreteStrategyA、ConcreteStrategyB、ConcreteStrategyC 等對象作配置.
在前端應用開發(fā)中,簡單分層結(jié)構(gòu)設計常常把存儲過程調(diào)用封裝到一個數(shù)據(jù)訪問類,用戶層通過調(diào)用這個類的方法去調(diào)用存儲過程,使界面層UI與數(shù)據(jù)訪問層DAO初步解耦.迪米特法則要求,一個對象應該最少地了解其它對象,一個類對其調(diào)用類的屬性、方法等應盡量少知道.因而這種應用方式的設計,有一個顯著的缺陷,那就是數(shù)據(jù)訪問層DAO會把所有的public方法暴露給客戶端UI,而不管客戶端的某個調(diào)用是否真正需要訪問那么多方法,會導致前端UI與數(shù)據(jù)層的耦合度升高.如果把對每個存儲過程的調(diào)用封裝為一個職責單一的類,這樣與前端耦合很低,但面對眾多的存儲過程時,這種過度的設計增加了系統(tǒng)開發(fā)維護的復雜性.
本文另辟蹊徑,應用策略模式來研究存儲過程在前端高層模塊的使用.在策略模式設計思維下,每個存儲過程調(diào)用視為一種策略,每一種策略即是一個類,需要實現(xiàn)它上層的抽象,上層類是整個策略家族的抽象.
本文以執(zhí)行查詢語句返回數(shù)據(jù)結(jié)果集的存儲過程為研究對象,把研究對象分為無參數(shù)和有參數(shù)的存儲過程,遵從接口隔離原則,策略抽象也分為兩類,一類是其抽象的方法中不帶參數(shù),是所有無參數(shù)調(diào)用存儲過程的抽象表達,另一類是其抽象的方法中帶參數(shù),是所有帶參數(shù)的存儲過程調(diào)用的抽象表達.每個具體的策略實現(xiàn)一個抽象策略中的方法,即對數(shù)據(jù)庫中的存儲過程進行調(diào)用.封裝策略的類也因此有帶參數(shù)的策略類和不帶參數(shù)的策略類,具體策略根據(jù)其實現(xiàn)的抽象類,被封裝到相應的策略封裝類中,屏蔽了高層模塊對低層策略算法的直接訪問.此時數(shù)據(jù)訪問類DAO成為抽象類的protected修飾的內(nèi)部屬性,只提供給其子類訪問,也不與高層模塊耦合了.
現(xiàn)有三個存儲過程,up_teacher不帶參數(shù)查詢老師信息,up_studentByClass按班級查詢學生信息,班名是參數(shù),up_reportByCourse以課程名為參數(shù),查詢指定的一門課程成績,由此識別出三個類:老師類Teacher、學生類Student、成績報表類Report.畫出類圖如圖2:
圖2 存儲過程的相關類圖
StrategyWithoutPara是無參數(shù)策略的抽象類,其中包含抽象DAO屬性和不帶參數(shù)返回數(shù)據(jù)集的方法getDataSet(),Teacher類繼承此抽象類,覆寫它的getDataSet方法,間接調(diào)用了DAO中的up_teacher存儲過程.
StrategyWithtPara是有參數(shù)策略的抽象,其中也包含DAO屬性和帶參數(shù)返回數(shù)據(jù)集的方法getDataSet(ArrayListParaList),Student類繼承此抽象類,覆寫它的getDataSet(ArrayListParaL-ist)方法,間接調(diào)用了DAO中的up_studentBy-Class存儲過程.
ContextWithoutPara類封裝所有方法中不帶參數(shù)的具體策略,即具體算法或行為getDataSet(),維護對一個StrategyWithoutPara對象的引用.
ContextWithPara類封裝所有方法中帶參數(shù)的具體策略,具體算法或行為getDataSet(ArrayList ParaList),維護對一個StrategyWithPara對象的引用.
DAO類封裝了對后臺數(shù)據(jù)庫連接管理、數(shù)據(jù)訪問、存儲過程調(diào)用,作為抽象類StrategyWithtPara和StrategyWithtoutPara的屬性對象,提供方法供抽象類調(diào)用.
Client場景類模擬高層模塊,聲明具體的策略和對具體策略的封裝類ContextWithout、ParaStrategyWithtPara,執(zhí)行封裝后的方法getDataSet、getDataSet(ArrayListParaList).
如果系統(tǒng)功能需要擴展,如查詢某門課程成績,只需添加Report子類,并繼承Strategy WithtPara類,在覆寫帶參數(shù)的方法getDataSet(ArrayListParaList)里,調(diào)用up_reportByCourse即可,高層模塊通過Report類產(chǎn)生新的類,實現(xiàn)業(yè)務的變化對系統(tǒng)的最小化影響,不用修改其它類,只作橫向擴展,也符合“對擴展開放,對修改關閉”的開閉原則,提高了系統(tǒng)的復用性、可維護性.
高層模塊的調(diào)用極其簡略,代碼調(diào)用也很簡潔,當需要使用哪一個具體的策略時,實例出它對應的對象,放入封裝類里,再執(zhí)行它的封裝方法,過程也十分明了。采用繼承和多態(tài)的對象機制,策略模式使得系統(tǒng)以增加新類實現(xiàn)其抽象接口的方式方便地擴展了系統(tǒng)。
[1]AlanShalloway.設計模式解析[M].徐言聲,譯.北京:人民郵電出版社,2016.
[2]程杰.大話設計模式[M].北京:清華大學出版社,2007.
[3]秦小波.設計模式之禪[M].北京:機械工業(yè)出版社,2011.
[4]許俊.對非1NF關系查詢的探討[J].四川職業(yè)技術學院學報,2013,(5).
[5]許俊.對Oracle多表關聯(lián)更新的應用研究[J].四川職業(yè)技術學院學報,2015,(2).
On the Usage of Stored Procedure Based on Strategy Pattern
XU Jun
(Computer Science Department, Sichuan Vocational and Technical College, Suining Sichuan,629000)
The paper applies the strategy pattern to study the use of the stored procedure of the return data result set at the front end of the high-level module. Under the design of strategy pattern,each stored procedure call is treated as a strategy,and each strategy is a class,to achieve the abstraction of the upper to the strategy family.With a detailed analysis of the two types of storage processes (with and without parameters),we design the class diagram and realize the use of the pettern to further improve the system’s reusability and maintainability.
Strategy Patttern;Database;Stored Procedure
張隆輝
TP311.1
A
1672-2094(2017)05-0147-04
2017-05-26
四川省教育廳重點科研項目“基于NoSQL大數(shù)據(jù)技術的信息搜索方案研究”(編號:15ZA0348)、“網(wǎng)絡大數(shù)據(jù)測試基準研究”(編號:15ZA0349)成果之一.
許 俊(1969-),男,四川蓬溪人,四川職業(yè)技術學院副教授,碩士.研究方向:軟件工程,數(shù)據(jù)庫技術.