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就可以完成新报文的实现,从而达到了松耦合、可扩展的设计。
相关推荐
以上代码演示了如何手工构建SOAP请求报文,并通过`HttpURLConnection`发送到Web Service接口。这种方式灵活,可以处理各种复杂的报文结构,包括那些AXIS等框架难以处理的SOAP Header。 在处理与第三方服务的报文...
3. WSDL 描述:Web Service 描述语言(WSDL)是 XML 格式,用于定义 Web Service 的接口,包括服务的位置、提供的操作以及如何调用这些操作。 4. UDDI 注册:统一描述、发现和集成(UDDI)是一个标准,用于发布和...
泛微 Webservice 接口文档说明 泛微 Webservice 接口文档说明是指泛微系统提供的一种基于 XML 的 Web 服务接口,用于实现客户关系管理(CRM)系统与其他系统之间的数据交互。该接口文档提供了接口的使用说明、数据...
在企业级应用开发中,尤其是涉及到服务端接口(如WebService)的设计与实现时,日志记录变得尤为重要。它不仅可以帮助开发者更好地理解系统运行状况、定位问题所在,还能为后续的维护工作提供重要的参考依据。Apache...
WebService接口利用WSDL(Web Services Description Language)定义服务接口,UDDI(Universal Description, Discovery, and Integration)用于服务注册和发现,以及SOAP进行消息传输。相比于HTTP接口,WebService...
本实例主要关注的是如何调用Web Service接口,我们将探讨相关的关键知识点。 首先,理解Web Service的基本概念非常重要。它通过SOAP(Simple Object Access Protocol)协议传输数据,使用WSDL(Web Services ...
Web服务(WebService)是一种基于互联网的、平台独立的软件接口,允许不同系统之间进行交互和数据交换。在本例中,我们关注的是与WebService接口相关的知识,特别是涉及到XML格式的参数传递和返回值处理。标签“wsdl...
接着,我们需要定义服务接口和服务实现类,使用注解如`@WebService`和`@WebMethod`来标识服务和方法。然后,SpringBoot会自动扫描这些注解,并将服务暴露为Web服务供外部调用。 日志管理在任何应用程序中都是至关...
.NET Webservice Studio是一种以交互方式调用Web方法的工具。 用户可以提供WSDL端点。 单击按钮获取工具获取WSDL,从WSDL生成.NET代理并显示可用方法列表。 用户可以选择任何方法并提供所需的输入参数。 在单击...
- **优化服务设计**:通过分析日志,了解服务的使用模式和需求,从而改进服务设计,提高服务质量。 - **审计与合规性**:对于有严格审计要求的企业,日志记录是保证业务操作合规性的必要手段。 总之,"SAP ...
腾讯地图WebService地址解析接口是一种基于Web服务的技术,用于将地理坐标(经纬度)转换为具体的行政区域地址。这种接口在处理地理位置数据时非常有用,尤其是在分析用户行为、位置跟踪或提供定位服务的场景中。...
【Storm Webservice接口调试工具】是一款专为Web服务接口调试设计的应用程序,它以其简约...无论是在项目的初期接口设计,还是后期的维护阶段,都能够发挥重要作用,帮助开发者快速定位和解决问题,推动项目顺利进行。
### C# 开发WebService接口、请求HTTP接口及IIS发布服务详解 #### 一、概述 本篇将详细介绍如何利用C#与Visual Studio 2022开发WebService接口、请求HTTP接口并最终通过IIS发布服务的过程。我们将涵盖以下几个方面...
Web服务(WebService)是一种基于标准协议的,可互操作的软件接口,允许不同系统之间进行数据交换和功能调用。在本案例中,我们将重点讨论如何使用Axis框架来调用Web服务并传递参数。 首先,我们需要理解Web服务的...
java开发过程中,很多地方都会遇到数据传递,远程获取数据问题,我这个简单的webservice接口发布可以在java开发过程中,很多地方都会遇到数据传递,远程获取数据问题,我这个简单的webservice接口发布可以在
泛微OA e-cology 8 最新webservice接口文档摘要 泛微OA e-cology 8 最新webservice接口文档提供了一系列的webservice接口,用于对系统中的文档进行操作,包括创建文档、删除文档、更新文档、查看文档等。这些接口...
描述:本实验使用SpringBoot、Mybatis和CXF框架来实现Restful API和WebService API接口的大实验,涵盖了数据库设计、 Maven依赖管理、Restful API和WebService API的实现等方面。 标签:spring boot、mybatis、...
### 使用HttpClient调用WebService接口详解 #### 一、概述 在现代软件开发中,Web服务(尤其是WebService)作为实现系统间交互的一种重要手段被广泛采用。WebService提供了通过HTTP协议进行远程过程调用的能力,...
Java WebService接口开发是将Java应用程序暴露为网络服务的一种方式,允许不同系统间的数据交换和交互。本案例将深入探讨如何使用Java实现Web服务的创建、发布和调用。 一、理解WebService WebService是一种基于...
描述中提到,"用于webservice或者http接口进行连接对接测试的工具storm",这表明Storm是一个专门设计用来验证和测试WebService或HTTP接口功能是否正常,性能是否达标,以及能否正确与其他系统集成的软件。...