許 俊
(四川職業(yè)技術(shù)學(xué)院計(jì)算機(jī)科學(xué)系,四川 遂寧 629000)
基于策略模式的存儲(chǔ)過(guò)程使用研究
許 俊
(四川職業(yè)技術(shù)學(xué)院計(jì)算機(jī)科學(xué)系,四川 遂寧 629000)
應(yīng)用策略模式來(lái)研究返回?cái)?shù)據(jù)結(jié)果集的存儲(chǔ)過(guò)程在前端高層模塊的使用.在策略模式設(shè)計(jì)思維下,每個(gè)存儲(chǔ)過(guò)程調(diào)用視為一種策略,每一種策略即是一個(gè)類(lèi),去實(shí)現(xiàn)它上層對(duì)策略家族的抽象.本文按有參和無(wú)參兩類(lèi)存儲(chǔ)過(guò)程作詳細(xì)分析,設(shè)計(jì)類(lèi)圖,并實(shí)現(xiàn).所研究的使用模式,進(jìn)一步提高了系統(tǒng)的復(fù)用性、可維護(hù)性.
策略模式;數(shù)據(jù)庫(kù);存儲(chǔ)過(guò)程
策略模式是定義了算法家族,封裝每一個(gè)算法,每一個(gè)算法能夠互相替換.算法家族的各個(gè)算法完成相同的操作,只不過(guò)實(shí)現(xiàn)的方式不同而已.調(diào)用它們的方式是同樣的,這樣就減少了各個(gè)算法類(lèi)與調(diào)用算法的類(lèi)的耦合.
策略模式的適用性是下面的范圍:多個(gè)關(guān)聯(lián)的類(lèi)只是它們的操作有一些差異;稍有變異的實(shí)體使用一個(gè)算法;需要對(duì)調(diào)用者隱藏算法和數(shù)據(jù)結(jié)構(gòu).策略模式的一般類(lèi)圖如圖1:
圖1 策略模式的一般類(lèi)圖
Stategy:指策略,定義全體公共的接口,Context通過(guò)些接口調(diào)用 ConcreteStrategyA、ConcreteStrategyB、ConcreteStrategyC 等定義的算法.
ConcreteStrategy:具體策略,以Strategy實(shí)現(xiàn)某個(gè)具體的算法.
Context:策略相關(guān)文本.引用Strategy對(duì)象,用一個(gè)具體的策略 ConcreteStrategyA、ConcreteStrategyB、ConcreteStrategyC 等對(duì)象作配置.
在前端應(yīng)用開(kāi)發(fā)中,簡(jiǎn)單分層結(jié)構(gòu)設(shè)計(jì)常常把存儲(chǔ)過(guò)程調(diào)用封裝到一個(gè)數(shù)據(jù)訪(fǎng)問(wèn)類(lèi),用戶(hù)層通過(guò)調(diào)用這個(gè)類(lèi)的方法去調(diào)用存儲(chǔ)過(guò)程,使界面層UI與數(shù)據(jù)訪(fǎng)問(wèn)層DAO初步解耦.迪米特法則要求,一個(gè)對(duì)象應(yīng)該最少地了解其它對(duì)象,一個(gè)類(lèi)對(duì)其調(diào)用類(lèi)的屬性、方法等應(yīng)盡量少知道.因而這種應(yīng)用方式的設(shè)計(jì),有一個(gè)顯著的缺陷,那就是數(shù)據(jù)訪(fǎng)問(wèn)層DAO會(huì)把所有的public方法暴露給客戶(hù)端UI,而不管客戶(hù)端的某個(gè)調(diào)用是否真正需要訪(fǎng)問(wèn)那么多方法,會(huì)導(dǎo)致前端UI與數(shù)據(jù)層的耦合度升高.如果把對(duì)每個(gè)存儲(chǔ)過(guò)程的調(diào)用封裝為一個(gè)職責(zé)單一的類(lèi),這樣與前端耦合很低,但面對(duì)眾多的存儲(chǔ)過(guò)程時(shí),這種過(guò)度的設(shè)計(jì)增加了系統(tǒng)開(kāi)發(fā)維護(hù)的復(fù)雜性.
本文另辟蹊徑,應(yīng)用策略模式來(lái)研究存儲(chǔ)過(guò)程在前端高層模塊的使用.在策略模式設(shè)計(jì)思維下,每個(gè)存儲(chǔ)過(guò)程調(diào)用視為一種策略,每一種策略即是一個(gè)類(lèi),需要實(shí)現(xiàn)它上層的抽象,上層類(lèi)是整個(gè)策略家族的抽象.
本文以執(zhí)行查詢(xún)語(yǔ)句返回?cái)?shù)據(jù)結(jié)果集的存儲(chǔ)過(guò)程為研究對(duì)象,把研究對(duì)象分為無(wú)參數(shù)和有參數(shù)的存儲(chǔ)過(guò)程,遵從接口隔離原則,策略抽象也分為兩類(lèi),一類(lèi)是其抽象的方法中不帶參數(shù),是所有無(wú)參數(shù)調(diào)用存儲(chǔ)過(guò)程的抽象表達(dá),另一類(lèi)是其抽象的方法中帶參數(shù),是所有帶參數(shù)的存儲(chǔ)過(guò)程調(diào)用的抽象表達(dá).每個(gè)具體的策略實(shí)現(xiàn)一個(gè)抽象策略中的方法,即對(duì)數(shù)據(jù)庫(kù)中的存儲(chǔ)過(guò)程進(jìn)行調(diào)用.封裝策略的類(lèi)也因此有帶參數(shù)的策略類(lèi)和不帶參數(shù)的策略類(lèi),具體策略根據(jù)其實(shí)現(xiàn)的抽象類(lèi),被封裝到相應(yīng)的策略封裝類(lèi)中,屏蔽了高層模塊對(duì)低層策略算法的直接訪(fǎng)問(wèn).此時(shí)數(shù)據(jù)訪(fǎng)問(wèn)類(lèi)DAO成為抽象類(lèi)的protected修飾的內(nèi)部屬性,只提供給其子類(lèi)訪(fǎng)問(wèn),也不與高層模塊耦合了.
現(xiàn)有三個(gè)存儲(chǔ)過(guò)程,up_teacher不帶參數(shù)查詢(xún)老師信息,up_studentByClass按班級(jí)查詢(xún)學(xué)生信息,班名是參數(shù),up_reportByCourse以課程名為參數(shù),查詢(xún)指定的一門(mén)課程成績(jī),由此識(shí)別出三個(gè)類(lèi):老師類(lèi)Teacher、學(xué)生類(lèi)Student、成績(jī)報(bào)表類(lèi)Report.畫(huà)出類(lèi)圖如圖2:
圖2 存儲(chǔ)過(guò)程的相關(guān)類(lèi)圖
StrategyWithoutPara是無(wú)參數(shù)策略的抽象類(lèi),其中包含抽象DAO屬性和不帶參數(shù)返回?cái)?shù)據(jù)集的方法getDataSet(),Teacher類(lèi)繼承此抽象類(lèi),覆寫(xiě)它的getDataSet方法,間接調(diào)用了DAO中的up_teacher存儲(chǔ)過(guò)程.
StrategyWithtPara是有參數(shù)策略的抽象,其中也包含DAO屬性和帶參數(shù)返回?cái)?shù)據(jù)集的方法getDataSet(ArrayListParaList),Student類(lèi)繼承此抽象類(lèi),覆寫(xiě)它的getDataSet(ArrayListParaL-ist)方法,間接調(diào)用了DAO中的up_studentBy-Class存儲(chǔ)過(guò)程.
ContextWithoutPara類(lèi)封裝所有方法中不帶參數(shù)的具體策略,即具體算法或行為getDataSet(),維護(hù)對(duì)一個(gè)StrategyWithoutPara對(duì)象的引用.
ContextWithPara類(lèi)封裝所有方法中帶參數(shù)的具體策略,具體算法或行為getDataSet(ArrayList ParaList),維護(hù)對(duì)一個(gè)StrategyWithPara對(duì)象的引用.
DAO類(lèi)封裝了對(duì)后臺(tái)數(shù)據(jù)庫(kù)連接管理、數(shù)據(jù)訪(fǎng)問(wèn)、存儲(chǔ)過(guò)程調(diào)用,作為抽象類(lèi)StrategyWithtPara和StrategyWithtoutPara的屬性對(duì)象,提供方法供抽象類(lèi)調(diào)用.
Client場(chǎng)景類(lèi)模擬高層模塊,聲明具體的策略和對(duì)具體策略的封裝類(lèi)ContextWithout、ParaStrategyWithtPara,執(zhí)行封裝后的方法getDataSet、getDataSet(ArrayListParaList).
如果系統(tǒng)功能需要擴(kuò)展,如查詢(xún)某門(mén)課程成績(jī),只需添加Report子類(lèi),并繼承Strategy WithtPara類(lèi),在覆寫(xiě)帶參數(shù)的方法getDataSet(ArrayListParaList)里,調(diào)用up_reportByCourse即可,高層模塊通過(guò)Report類(lèi)產(chǎn)生新的類(lèi),實(shí)現(xiàn)業(yè)務(wù)的變化對(duì)系統(tǒng)的最小化影響,不用修改其它類(lèi),只作橫向擴(kuò)展,也符合“對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉”的開(kāi)閉原則,提高了系統(tǒng)的復(fù)用性、可維護(hù)性.
高層模塊的調(diào)用極其簡(jiǎn)略,代碼調(diào)用也很簡(jiǎn)潔,當(dāng)需要使用哪一個(gè)具體的策略時(shí),實(shí)例出它對(duì)應(yīng)的對(duì)象,放入封裝類(lèi)里,再執(zhí)行它的封裝方法,過(guò)程也十分明了。采用繼承和多態(tài)的對(duì)象機(jī)制,策略模式使得系統(tǒng)以增加新類(lèi)實(shí)現(xiàn)其抽象接口的方式方便地?cái)U(kuò)展了系統(tǒng)。
[1]AlanShalloway.設(shè)計(jì)模式解析[M].徐言聲,譯.北京:人民郵電出版社,2016.
[2]程杰.大話(huà)設(shè)計(jì)模式[M].北京:清華大學(xué)出版社,2007.
[3]秦小波.設(shè)計(jì)模式之禪[M].北京:機(jī)械工業(yè)出版社,2011.
[4]許俊.對(duì)非1NF關(guān)系查詢(xún)的探討[J].四川職業(yè)技術(shù)學(xué)院學(xué)報(bào),2013,(5).
[5]許俊.對(duì)Oracle多表關(guān)聯(lián)更新的應(yīng)用研究[J].四川職業(yè)技術(shù)學(xué)院學(xué)報(bào),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
四川省教育廳重點(diǎn)科研項(xiàng)目“基于NoSQL大數(shù)據(jù)技術(shù)的信息搜索方案研究”(編號(hào):15ZA0348)、“網(wǎng)絡(luò)大數(shù)據(jù)測(cè)試基準(zhǔn)研究”(編號(hào):15ZA0349)成果之一.
許 俊(1969-),男,四川蓬溪人,四川職業(yè)技術(shù)學(xué)院副教授,碩士.研究方向:軟件工程,數(shù)據(jù)庫(kù)技術(shù).
四川職業(yè)技術(shù)學(xué)院學(xué)報(bào)2017年5期