`

从银行WebService报文接口系统中,学习敏捷设计

阅读更多

Preface:

 

合理的软件架构设计其好处是不言而喻的,系统具有清晰的软件结构,良好的可扩展性,类的职能单一明确,系统的复杂度底。此前的一个实际项目中总结了些关于OO设计的实际应用,主要是围绕‘高内聚及松耦合’,‘开闭原则’的一些应用。

 

Problem:

 

目前有一个实际应用放在我们面前,为一个银行现有BI系统开发WebService对外数据接口应用,数据交换方式以预定请求及响应报文来完成,要求可以数据接口系统跨平台使用。即远程客户端发来一种XML数据请求报文,系统按类型执行查询,然后返回XML数据响应报文。

 

问题也浮出水面,通常此类系统中我们可以想像到,其中一定会有一系列的if else来判断是何种请求报文,然后再执行对应的动作,但我们如果我们这样设计,系统就违反了开放-封闭原则 (OCP,Open-Close Principle),日后的扩展一定需要修改原有代码,而我们期望的是日后添加一种新报文后,只在系统中扩展新的请求、查询及响应对象来实现新需求。

 

带着问题思考解决办法...

 

补充:敏捷设计扩展知识手册

 

拙劣设计的症状:

 

1.僵化性(Rigidity):设计难以改变。很难对系统进行改动,因为每个改动都会迫使许多对系统其他部分的其他改动。

2.脆弱性(Fragility):设计易于遭到破坏。对系统的改动会导致系统中和改动的地方在概念上无关的许多地方发现问题。3.牢固性 (Immobility):设计难以重用。很难解开系统的纠结,使之成为一些可在其他系统中重用的组件。

4.粘滞性(Viscosity):难以做正确的事情。做正确的事情比做错误的事情要困难。

5.不必要的复杂性(Needless Complexity):过分设计。设计中包含有不具有任何直接好处的基础结构。

6.不必要的重复性(Needlsee Repetition):滥用复制/粘贴。设计中包含有重复的结构,而该重复的对象本可以使用单一的抽象进行统一。

7.晦涩性(Opacity):很难阅读、理解。没有很好的表现出意图。

 

 

面向对象的设计原则:

 

1.单一职责原则 (SRP,Single Resposibility Principle)

2.开放-封闭原则 (OCP,Open-Close Principle)

3.Liskov替换原则 (LSP,Liskov Principle)

4.依赖倒置原则 (DIP,Dependicy Independent Priciple)

5.接口隔离原则 (ISP,Interface Seperation Principle)

 

Solution:

 

我们初步的想法是,系统接受到一种XML请求后将其转换成请求对象,类似多态的方法,根据不同的请求对象由查询工厂来创建返回不同的查询处理类,再由查询处理类返回填充好的数据响应对象,最后转换成XML响应报文。由此思路,我们完成了UML类图设计,如下:

 

 

 

首先是RemoteQueryService 接口,系统对外的WS服务由此接口完成。

 

/**
 * 类说明: WS远程服务接口<br>
 * 创建时间: 2009-11-6 上午10:07:55<br>
 * 
 * @author Seraph<br>
 * @email seraph115@gmail.com<br>
 * 
 */
public interface RemoteQueryService {

	/**
	 * 功能说明: <br>
	 * 创建者: Seraph<br>
	 * 创建时间: 2009-11-6 上午10:08:09<br>
	 * 
	 * @param request
	 * @return
	 */
	@Profiled(tag = "RemoteQueryService")
	public String doQuery(String request);

}

 

RemoteQueryServiceImpl 类是此接口的实现,接口方法为接受一种XML请求报文然后返回响应报文。

RegisterContainer 类,在系统初始化时完成不同请求所对应的查询处理类的注册。

QueryFactory 类,根据不同的请求对象返回不同的查询处理类。

ParserRobot 类,负责将XML请求转换为Java请求对象,将Java响应对象转换为XML报文。

QueryProvider 抽象类,是不同种查询处理类的父类。

Request 类,是请求对象的父类。

Response 类,是响应对象的父类。

 

其中QueryProvider 类,doQuery抽象方法由继承后的子类实现,用来实现不同种报文的查询处理方法,代码为:

/**
 * 类说明: <br>
 * 创建时间: 2009-11-6 上午10:21:30<br>
 * 
 * @author Seraph<br>
 * @email seraph115@gmail.com<br>
 * 
 */
@Service
public abstract class QueryProvider {

	private QueryDaoSupport queryDaoSupport;

	private SqlProvider sqlProvider;

	public abstract Response doQuery(Request request) throws BrwsException;

	public QueryDaoSupport getQueryDaoSupport() {
		return queryDaoSupport;
	}

	public void setQueryDaoSupport(QueryDaoSupport queryDaoSupport) {
		this.queryDaoSupport = queryDaoSupport;
	}

	public SqlProvider getSqlProvider() {
		return sqlProvider;
	}

	public void setSqlProvider(SqlProvider sqlProvider) {
		this.sqlProvider = sqlProvider;
	}

}
 

由UML图中,我们可以看到Request , QueryProvider , Response有许多对应的子类,而每个子类都是一种报文类型,也就是系统所能提供的查询服务。所以目前的架构设计下,日后添加一种新报文将很容易,只需要实现一组 Request, QueryProvide及 Response就可以完成新报文的实现,从而达到了松耦合、可扩展的设计。

 

 

 

 

 

 

 

 

分享到:
评论
15 楼 weibawoaini 2010-04-02  
学习学习,。。。。。
14 楼 Seraph115 2010-04-02  
zoutm 写道
我的想法是使用策略模式,并自己构造classloader对个性化处理的模块进行加载,可以做到server不重启,替换类就可以改变业务处理行为


你的想法是否可以理解为使用osgi实现呢?osgi也是实现运行时使用多个classloader加载。你的想法开始我也考虑了,但因需求关系最终没有考虑。
也可以不使用osgi,因为系统中使用了Spring容器,所以通过对BeanFactory的扩展,运行时也可动态加载新加入的请求报文类型。



13 楼 Seraph115 2010-04-02  
shuiguozheng 写道
想问一下楼主用的uml设计工具是什么?


Visual Paradigm UML  :-)
http://www.visual-paradigm.com/product/vpuml/

12 楼 tws502934462 2010-04-02  
lz  学习了,能再说的详细点就更好了
11 楼 hatedance 2010-04-02  
我经常看到有人用了Web Service以后,输入输出参数还是XML的。
为什么啊?
这样还不如直接用http GET/POST好了,WS的好处根本没用到嘛。
10 楼 melin 2010-04-02  
学习了,期待你的更多作品
9 楼 yongdi2 2010-04-02  
学习了。好的架构是成功的开始和关键
8 楼 shuiguozheng 2010-04-02  
想问一下楼主用的uml设计工具是什么?
7 楼 xucons 2010-04-02  
UML图需要改进
6 楼 shuiguozheng 2010-04-02  
楼主的精神不错! 
5 楼 J-catTeam 2010-04-02  
喜欢这种排版和表达方式~,赞一个~
4 楼 lzz4438253 2010-04-02  
   另外,敏捷设计``可能我out了...
3 楼 lzz4438253 2010-04-02  
应该是写个接口吧.......
2 楼 zoutm 2010-04-02  
我的想法是使用策略模式,并自己构造classloader对个性化处理的模块进行加载,可以做到server不重启,替换类就可以改变业务处理行为
1 楼 zoutm 2010-04-02  
是策略模式的典型使用场景

相关推荐

    webservice开发方式,报文修改

    在IT行业中,Web Service是一种基于网络的通信协议,允许不同系统之间进行数据交换。本文将深入探讨Web Service的开发方式,特别是针对报文修改和兼容性问题,以解决与第三方服务端对接时遇到的挑战。 首先,Web ...

    webservice接口文档说明.docx

    泛微 Webservice 接口文档说明是指泛微系统提供的一种基于 XML 的 Web 服务接口,用于实现客户关系管理(CRM)系统与其他系统之间的数据交互。该接口文档提供了接口的使用说明、数据格式要求、返回结果说明等内容。 ...

    HTTP接口和WebService接口

    HTTP接口和WebService接口是两种常见的服务交互方式,它们在IT领域中扮演着至关重要的角色,尤其是在分布式系统和网络通信中。 HTTP接口,全称为HyperText Transfer Protocol接口,是基于TCP/IP协议的应用层协议,...

    泛微OA e-cology 8 最新webservice接口文档

    泛微OA e-cology 8 最新webservice接口文档提供了一系列的webservice接口,用于对系统中的文档进行操作,包括创建文档、删除文档、更新文档、查看文档等。这些接口可以通过webservice调用,实现对文档的管理和操作。...

    SpringBoot+Mybatis+CXF框架,实现Restful api与 WebService api接口的大实验

    描述:本实验使用SpringBoot、Mybatis和CXF框架来实现Restful API和WebService API接口的大实验,涵盖了数据库设计、 Maven依赖管理、Restful API和WebService API的实现等方面。 标签:spring boot、mybatis、...

    CXF打印SOAP报文,记录WebService日志

    在企业级应用开发中,尤其是涉及到服务端接口(如WebService)的设计与实现时,日志记录变得尤为重要。它不仅可以帮助开发者更好地理解系统运行状况、定位问题所在,还能为后续的维护工作提供重要的参考依据。Apache...

    发布webService服务接口与spring整合教程

    在IT行业中,Web Service是一种基于标准协议(如SOAP、RESTful等)的接口,使得不同系统之间能够通过网络进行通信和数据交换。本教程将详细讲解如何将Web Service服务接口与Spring框架进行整合,以便在实际开发中...

    webservice接口调用

    * 企业内部系统集成:WebService 接口调用可以用来集成企业内部的各个系统,实现数据交换和业务逻辑的调用。 * 第三方服务集成:WebService 接口调用可以用来集成第三方服务,例如支付 gateway、短信 gateway 等。 *...

    java webService接口开发案例

    Java WebService接口开发是将Java应用程序暴露为网络服务的一种方式,允许不同系统间的数据交换和交互。本案例将深入探讨如何使用Java实现Web服务的创建、发布和调用。 一、理解WebService WebService是一种基于...

    webservice接口调用实例

    Web服务(Web Service)是一种基于互联网的、使用标准XML(Extensible Markup Language)进行通信的软件服务,允许不同系统间的应用程序进行交互。本实例主要关注的是如何调用Web Service接口,我们将探讨相关的关键...

    java使用XFire调用webService接口

    在本文中,我们将学习如何使用 XFire 框架在 Java 中调用 webService 接口。XFIRE 是一个基于 Java 的开源框架,用于简化 Web 服务的开发和集成。下面,我们将通过一个简单的例子,展示如何使用 XFire 调用 ...

    java发布webservice接口

    java开发过程中,很多地方都会遇到数据传递,远程获取数据问题,我这个简单的webservice接口发布可以在java开发过程中,很多地方都会遇到数据传递,远程获取数据问题,我这个简单的webservice接口发布可以在

    21.集成开发需求方案附件二:OA系统工作流WebService接口使用说明.doc

    泛微OA系统是一款广泛应用于企业办公自动化的工作流管理系统,它提供了强大的WebService接口,使得外部系统可以方便地与其进行数据交互和流程控制。本说明文档详细介绍了如何使用这些接口,包括检查部署状态、调用...

    人力资源(HrmService)WebService接口使用说明.rar

    在泛微E8和E9系统中,HrmService Web Service接口提供了与人力资源管理相关的服务,使得开发者可以远程调用,实现跨系统的功能扩展。 二、泛微E8、E9系统接口介绍 泛微E8和E9是泛微公司推出的高级协同办公系统,...

    webservice接口调试工具

    本篇文章将深入探讨“webservice接口调试工具”的使用方法,以及它在实际开发中的应用。 【描述】:接口调试工具如Storm.exe,提供了直观且便捷的环境,开发者可以直接运行此程序进行接口调试。只需双击启动Storm....

    WebService接口测试工具—Strom

    Strom是一款优秀的测试工具,专为开发者设计,用于快速、方便地对WebService接口进行验证和调试。在本文中,我们将深入探讨Strom的功能、优势以及如何使用它来提升你的测试效率。 1. **什么是WebService接口**: ...

    c#操作XML 读取、生成,WEBSERVICE接口

    本教程将深入探讨如何在C#中操作XML,包括读取和生成XML文档,并利用Web Service接口进行数据传输。 1. **C#操作XML:读取** 在C#中,我们可以使用`System.Xml`命名空间中的类来处理XML文档。其中,`XmlDocument`...

    C# winfrom中webservice接口连接服务器上传图片和下载图片

    在C# WinForm应用开发中,常常需要与服务器进行数据交互,这通常通过WebService接口来实现。本主题将深入探讨如何在WinForm中利用WebService接口连接服务器,进行图片的上传和下载操作。以下是对这个主题的详细阐述...

    C# 开发webservice接口、请求HTTP接口、iis发布服务

    ### C# 开发WebService接口、请求HTTP接口及IIS发布服务详解 #### 一、概述 本篇将详细介绍如何利用C#与Visual Studio 2022开发WebService接口、请求HTTP接口并最终通过IIS发布服务的过程。我们将涵盖以下几个方面...

    httpClient调用webservice接口

    在现代软件开发中,Web服务(尤其是WebService)作为实现系统间交互的一种重要手段被广泛采用。WebService提供了通过HTTP协议进行远程过程调用的能力,使得不同应用程序之间能够进行数据交换与通信。其中,...

Global site tag (gtag.js) - Google Analytics