如何合理地设计软件应用系统中数据访问服务层内的各个功能程序类

软件项目实训及课程设计指导——如何合理地设计系统数据访问服务层中的各个功能程序类

1、应用”门面设计模式”倡导的程序结构关系编程实现数据访问服务组件

利用基于门面设计模式实现的数据访问服务组件隔离软件应用系统中业务处理逻辑和数据访问操作逻辑,在各个业务逻辑处理组件中只需要与数据访问服务组件进行交互,而不再需要与不同的DAO组件进行具体的交互。

这样的设计方案可以降低整个软件应用系统中的业务逻辑处理层和系统持久层中的数据访问组件之间的藕合度,将使得软件应用系统业务层组件的可重用性得到进一步地提高。

下图所示为实现这样的设计目标的UML类图示例,在具体的编程实现中,应该要保证各个业务处理类只与数据访问服务组件接口进行关联,而在数据访问服务接口实现组件中也应该只与各个数据访问接口发现关联——依赖倒置思想的具体应用。

2、正确地编程实现数据访问服务组件和各个数据访问组件之间关系的示例程序代码

(1)首先,设计和实现数据访问服务接口

package com.bluedream.webbank.service;import java.util.ArrayList;import com. bluedream.webbank.exception.WebBankException;import com. bluedream.webbank.model.vo.AccountInfoVO;public interface AccountDAOServiceInterface {      public ArrayList<AccountInfoVO> selectAllAccountInfo()      													throws WebBankException;      // ... 其它方法的定义在此省略}

(2)其次,再设计和实现数据访问服务接口的具体功能实现类,为数据访问服务接口中所定义的各个功能服务方法提供最终的功能实现。

package com. bluedream.webbank.service;import java.util.ArrayList;import com. bluedream.webbank.exception.WebBankException;import com. bluedream.webbank.model.vo.AccountInfoVO;public class AccountDAOServiceImple implements AccountDAOServiceInterface {        private AccountManageDAOInterface oneAccountManageDAOJDBCImple=null;        public ArrayList<AccountInfoVO> selectAllAccountInfo()                      throws WebBankException{               // ... 具体的功能实现代码在此省略        }        // ... 其他方法的功能实现代码在此省略}

(3)最后,正确地编程实现数据访问服务实现组件类和各个数据访问组件类之间的关系

在上述示例所示的数据访问服务接口的具体功能实现类(AccountDAOServiceImple)代码示例中通过包含数据访问组件接口对象而实现数据访问服务组件和各个数据访问组件之间的关系(请见上述示例代码中黑体所示的
oneAccountManageDAOJDBCImple对象的定义代码)——遵守”优先应用类之间的组合关系,少用程序类之间的继承关系”的设计原则。

基于上面的设计原则,读者在以后的软件应用系统项目开发实现中不应该采用下面示例所示的继承某个数据访问组件的实现类的设计方案(请见下面程序代码示例中黑体所示的代码public class AccountDAOServiceImple extends AccountDAOServiceImple),因为面向对象OOP程序设计方法中的继承关系会导致子类紧密依赖于其上层的基类。如下为采用继承机制实现的代码示例。

package com. bluedream.webbank.service;import java.util.ArrayList;import com. bluedream.webbank.exception.WebBankException;import com. bluedream.webbank.model.vo.AccountInfoVO;public class AccountDAOServiceImple extends AccountDAOServiceImpleimplements AccountDAOServiceInterface {        public ArrayList<AccountInfoVO> selectAllAccountInfo()        						throws WebBankException{        				// ... 具体的功能实现代码在此省略        }        // ... 其他方法的功能实现代码在此省略}

读者可以通过上述两种功能相同但采用不同设计风格编程实现的程序代码示例,深刻领悟程序类关系设计中所倡导的”优先应用组合、尽量少用继承”的设计原则。此设计原则大量地应用在GOF的23种设计模式中。

3、对各个数据访问服务组件的实现代码进一步重构——”找出共性,分离个性”

在软件应用系统中的各个数据访问服务组件中包含有类似功能实现的数据访问逻辑是一种很常见的现象,软件应用系统的开发人员此时应该要对软件应用系统中的各个数据访问服务组件的功能实现代码进一步重构(reFactor)——”找出共性,分离个性”以减少程序代码的重复度。

如下示图为MyEclipse开发工具中所提供的程序代码重构的功能菜单,MyEclipse开发工具全面地支持Martin Fowler在他的经典名著《重构:改善既有代码的设计》(英文书名: Refactoring: Improving the Design of Existing Code)一书中所倡导代码重构功能。

当然,软件应用系统的开发人员还应该仔细地思考下面的有关问题:

1)怎样合理地抽象出共性的数据访问逻辑?

2)怎样处理数据访问服务层中的各个方法之间的相互调用?

3)怎样处理数据访问服务层中的各个服务方法的事务?

为此,在程序设计方面,开发人员应该将”共性”的数据访问服务逻辑的程序代码封装到一个数据访问服务基类中,而将”个性化”的数据访问服务实现代码放在对应的子类中。因为面向对象OOP程序设计方法中的”继承与派生”是分离事物的”共性”和”个性”的常用设计手段。

下图所示为体现该设计思想的UML类图的示例图,各个数据访问服务子接口的实现类一方面实现各自的接口定义中的功能方法——它们代表”个性”的数据访问服务逻辑的实现代码,另一方面也继承数据访问服务基接口的实现类,这样将可以在各个数据访问服务子接口的实现类中重用数据访问服务基接口实现类中的各个功能方法——它们代表”共性”的数据访问服务逻辑的实现代码。

1)数据访问服务基接口的程序代码示例,在该接口中定义”共性”的数据访问服务逻辑

package com.bluedream.daoService;public interface BaseDAOService {			public void baseDAOServiceMethod();}

2)数据访问服务基接口的具体实现类的程序代码示例,在该程序类中最终完成”共性”的数据访问服务逻辑的功能实现

package com.bluedream.daoService;public class BaseDAOServiceImle implements BaseDAOService {      public BaseDAOServiceImle() {      }      public void baseDAOServiceMethod() {      }}

3)数据访问服务基接口的某个子接口的程序代码示例,在该接口中定义”个性”的数据访问服务逻辑以满足特定的应用功能

package com.bluedream.daoService;public interface BaseDAOServiceDerivedInterface extends BaseDAOService {				public void derivedDAOServiceMethod();}

4)数据访问服务子接口的实现类代码示例,在该程序类中最终完成”个性”的数据访问服务逻辑的功能实现

package com.bluedream.daoService;public class BaseDAOServiceDerivedInterfaceImple extends BaseDAOServiceImleImplements BaseDAOServiceDerivedInterface {      public BaseDAOServiceDerivedInterfaceImple() {      }      public void derivedDAOServiceMethod() {      }}

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年11月2日
下一篇 2020年11月2日

相关推荐