基于策略模式的存储过程使用研究

2017-12-29 04:25
四川职业技术学院学报 2017年5期
关键词:调用对象模块

许 俊

(四川职业技术学院计算机科学系,四川 遂宁 629000)

基于策略模式的存储过程使用研究

许 俊

(四川职业技术学院计算机科学系,四川 遂宁 629000)

应用策略模式来研究返回数据结果集的存储过程在前端高层模块的使用.在策略模式设计思维下,每个存储过程调用视为一种策略,每一种策略即是一个类,去实现它上层对策略家族的抽象.本文按有参和无参两类存储过程作详细分析,设计类图,并实现.所研究的使用模式,进一步提高了系统的复用性、可维护性.

策略模式;数据库;存储过程

1 策略模式

策略模式是定义了算法家族,封装每一个算法,每一个算法能够互相替换.算法家族的各个算法完成相同的操作,只不过实现的方式不同而已.调用它们的方式是同样的,这样就减少了各个算法类与调用算法的类的耦合.

策略模式的适用性是下面的范围:多个关联的类只是它们的操作有一些差异;稍有变异的实体使用一个算法;需要对调用者隐藏算法和数据结构.策略模式的一般类图如图1:

图1 策略模式的一般类图

Stategy:指策略,定义全体公共的接口,Context通过些接口调用 ConcreteStrategyA、ConcreteStrategyB、ConcreteStrategyC 等定义的算法.

ConcreteStrategy:具体策略,以Strategy实现某个具体的算法.

Context:策略相关文本.引用Strategy对象,用一个具体的策略 ConcreteStrategyA、ConcreteStrategyB、ConcreteStrategyC 等对象作配置.

2 存储过程的一般使用方式

在前端应用开发中,简单分层结构设计常常把存储过程调用封装到一个数据访问类,用户层通过调用这个类的方法去调用存储过程,使界面层UI与数据访问层DAO初步解耦.迪米特法则要求,一个对象应该最少地了解其它对象,一个类对其调用类的属性、方法等应尽量少知道.因而这种应用方式的设计,有一个显著的缺陷,那就是数据访问层DAO会把所有的public方法暴露给客户端UI,而不管客户端的某个调用是否真正需要访问那么多方法,会导致前端UI与数据层的耦合度升高.如果把对每个存储过程的调用封装为一个职责单一的类,这样与前端耦合很低,但面对众多的存储过程时,这种过度的设计增加了系统开发维护的复杂性.

3 基于策略模式的存储过程使用设计

3.1 设计思路

本文另辟蹊径,应用策略模式来研究存储过程在前端高层模块的使用.在策略模式设计思维下,每个存储过程调用视为一种策略,每一种策略即是一个类,需要实现它上层的抽象,上层类是整个策略家族的抽象.

本文以执行查询语句返回数据结果集的存储过程为研究对象,把研究对象分为无参数和有参数的存储过程,遵从接口隔离原则,策略抽象也分为两类,一类是其抽象的方法中不带参数,是所有无参数调用存储过程的抽象表达,另一类是其抽象的方法中带参数,是所有带参数的存储过程调用的抽象表达.每个具体的策略实现一个抽象策略中的方法,即对数据库中的存储过程进行调用.封装策略的类也因此有带参数的策略类和不带参数的策略类,具体策略根据其实现的抽象类,被封装到相应的策略封装类中,屏蔽了高层模块对低层策略算法的直接访问.此时数据访问类DAO成为抽象类的protected修饰的内部属性,只提供给其子类访问,也不与高层模块耦合了.

3.2 类图

现有三个存储过程,up_teacher不带参数查询老师信息,up_studentByClass按班级查询学生信息,班名是参数,up_reportByCourse以课程名为参数,查询指定的一门课程成绩,由此识别出三个类:老师类Teacher、学生类Student、成绩报表类Report.画出类图如图2:

图2 存储过程的相关类图

StrategyWithoutPara是无参数策略的抽象类,其中包含抽象DAO属性和不带参数返回数据集的方法getDataSet(),Teacher类继承此抽象类,覆写它的getDataSet方法,间接调用了DAO中的up_teacher存储过程.

StrategyWithtPara是有参数策略的抽象,其中也包含DAO属性和带参数返回数据集的方法getDataSet(ArrayListParaList),Student类继承此抽象类,覆写它的getDataSet(ArrayListParaL-ist)方法,间接调用了DAO中的up_studentBy-Class存储过程.

ContextWithoutPara类封装所有方法中不带参数的具体策略,即具体算法或行为getDataSet(),维护对一个StrategyWithoutPara对象的引用.

ContextWithPara类封装所有方法中带参数的具体策略,具体算法或行为getDataSet(ArrayList ParaList),维护对一个StrategyWithPara对象的引用.

DAO类封装了对后台数据库连接管理、数据访问、存储过程调用,作为抽象类StrategyWithtPara和StrategyWithtoutPara的属性对象,提供方法供抽象类调用.

Client场景类模拟高层模块,声明具体的策略和对具体策略的封装类ContextWithout、ParaStrategyWithtPara,执行封装后的方法getDataSet、getDataSet(ArrayListParaList).

如果系统功能需要扩展,如查询某门课程成绩,只需添加Report子类,并继承Strategy WithtPara类,在覆写带参数的方法getDataSet(ArrayListParaList)里,调用up_reportByCourse即可,高层模块通过Report类产生新的类,实现业务的变化对系统的最小化影响,不用修改其它类,只作横向扩展,也符合“对扩展开放,对修改关闭”的开闭原则,提高了系统的复用性、可维护性.

4 基于策略模式的存储过程使用实现

高层模块的调用极其简略,代码调用也很简洁,当需要使用哪一个具体的策略时,实例出它对应的对象,放入封装类里,再执行它的封装方法,过程也十分明了。采用继承和多态的对象机制,策略模式使得系统以增加新类实现其抽象接口的方式方便地扩展了系统。

[1]AlanShalloway.设计模式解析[M].徐言声,译.北京:人民邮电出版社,2016.

[2]程杰.大话设计模式[M].北京:清华大学出版社,2007.

[3]秦小波.设计模式之禅[M].北京:机械工业出版社,2011.

[4]许俊.对非1NF关系查询的探讨[J].四川职业技术学院学报,2013,(5).

[5]许俊.对Oracle多表关联更新的应用研究[J].四川职业技术学院学报,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大数据技术的信息搜索方案研究”(编号:15ZA0348)、“网络大数据测试基准研究”(编号:15ZA0349)成果之一.

许 俊(1969-),男,四川蓬溪人,四川职业技术学院副教授,硕士.研究方向:软件工程,数据库技术.

猜你喜欢
调用对象模块
28通道收发处理模块设计
“选修3—3”模块的复习备考
涉税刑事诉讼中的举证责任——以纳税人举证责任为考察对象
核电项目物项调用管理的应用研究
LabWindows/CVI下基于ActiveX技术的Excel调用
攻略对象的心思好难猜
基于系统调用的恶意软件检测技术研究
基于熵的快速扫描法的FNEA初始对象的生成方法
区间对象族的可镇定性分析
利用RFC技术实现SAP系统接口通信