关于项目模块间交互的一个设计思路

1.背景

  某API项目,项目天然地按业务分为了不同的包,那么每个包都独立处理自己的业务逻辑,独立接管数据源,独立地向外部提供数据,彼此基本互不通信。

  不过,随着需求的增多和业务的堆积,项目的复杂度越来越大,但是每个独立模块却又不足以独立出去成为一个单独的项目,而模块间又因业务需要开始发生交互的时候,问题来了。 

2.问题描述

  由于模块间的数据交互,按照Spring的套路,是可以直接把容器接管的对象注入到你需要的地方去的,那么一旦你开始问其他模块要数据,开始要命了。如上图,如果模块3问模块2和模块4要数据,理论上来说,他是不是可以随意注入这两个模块的各种服务呢?

答案是肯定的。这个时候你会发现一个问题,由于本来在一个模块内某个数据源可能经过多重必要的封装再提供接口数据的,但是其他模块他并不知道这一点。于是他极有可能注入数据源在封装的过程中各个阶段的服务类,也有可能直接注入了最底层的数据接口,他再去做自己的逻辑处理去自己封装一遍。这样,漫天飞舞的入侵完成了,这个地方飞满了各种各种的花蝴蝶,简直眼花缭乱,一片失去控制的景象。

3.解决思路

  这个时候笔者想到是否可以把某个模块的各种数据服务聚集到一个服务中去呢,对外部(其他模块)来说,约定好只允许调用我这个公共的服务接口,我对外部屏蔽掉所有逻辑,你外部也不用关心我的数据怎么来的,你只要问我这个接口要数据即可。如上图所示,

到此问题基本可以解决,优缺点也在图中描述了。

4.深入

  接着,笔者发现其实这个设计思路,类似于门面模式,或者说就是门面模式。网络上找来了门面模式的意图: 

Intent

  • Provide a unified interface to a set of interfaces in a subsystem. Facade defines a higher-level interface that makes the subsystem easier to use.
  • 对子系统中的一组接口提供了一个统一的接口。门面定义了更高层次的接口,使子系统更容易使用。
  • Wrap a complicated subsystem with a simpler interface.
  • 以简单的接口包装复杂的子系统

可以看到,笔者文章中所说的可以被视为是门面模式的一个应用场景,虽然不是系统级别的交互而只是模块之间的交互,但是笔者相信这样去设计至少在接口的易用性和模块间的解耦程度上,是可以做到有所提高的。至此,新设计模式get。

维基百科传送门:https://en.wikipedia.org/wiki/Facade_pattern

时间: 2024-10-26 03:16:14

关于项目模块间交互的一个设计思路的相关文章

Prism for WPF再探(基于Prism事件的模块间通信)

上篇博文链接 一.简单介绍: 在上一篇博文中初步搭建了Prism框架的各个模块,但那只是搭建了一个空壳,里面的内容基本是空的,在这一篇我将实现各个模块间的通信,在上一篇博文的基础上改的. 先上效果图:初步介绍下,图中虚线分割为四个模块,每个模块可向另外三个模块发消息.这里还是基于模块化开发CS端程序的思路,模块之间低耦合,如果项目做大,好处自然体现出来了. 图中的效果已经实现了一个模块朝其他三个模块发送消息.这里我使用的事Prism框架中的PubSubEvent事件,其优点是简单易用,直接Pub

C#开发微信门户及应用(43)--微信各个项目模块的定义和相互关系

我们在开发微信相关的应用的时候,一般需要完善的基础模块支持,包括微信公众号,微信企业号,以及一些业务模块的支持,一般随着功能的增多,我们需要非常清晰的界定他们的关系.模块的分拆以及合并往往需要考虑的代码的重用,而且尽量做到简单而不重复.本篇随笔基于我的微信框架的各个模块的功能介绍以及他们关系的描述. 1.公众号模块的命名及相关关系 微信开发,我们首先需要利用我们的语言(这里是利用C#语言),为所有用到的API接口实现进一步的封装,方便使用,微信API模块包含的内容很多,大概可以分为下面的项目.

2018-05-17-OAA-一种mermaid脚本驱动的软件项目模块图形化表述思路

layout: post title: 2018-05-17-OAA-一种mermaid脚本驱动的软件项目模块图形化表述思路 key: 20180517 tags: OAA flow chart sequence diagram 泳道图 时序图 图表 OAA PM Master modify_date: 05-17 --- OAA-一种mermaid脚本驱动的软件项目模块图形化表述思路 说明: 本文发布于: gitee,github,博客园 转载和引用请指明原作者和连接及出处. 正文: 说明:这

地铁规划项目需求理解和设计思路

地铁规划项目需求理解和设计思路 需求理解 将地铁线路保存成一个可读入,简洁明了的文本 程序能正确读入这个文件,并获取地铁线路信息 程序能正确处理输入的命令行 地铁能正确输出指定地铁线经过的站点 程序能正确输出两个站点间的最短路径 程序要有健壮性,能通过各类性能测试 按要求编写博客,详细说明花费时间,代码,各个模块和测试用例 设计思路 文本格式 1号线 刘园 西横堤 果酒厂 本溪路 勤俭道..... 2号线 曹庄 卞兴 荠园西道 咸阳路...... 3号线 小淀 丰产河 华北集团...... 按照

解决模块间耦合的设计模式

大家都知道,模块间的耦合不利于代码的可读性和可维护性,好的代码一般都会按功能或者别的将代码模块化,那么模块化的代码之间怎么通信呢?下面来介绍两种用于模块间解耦的设计模式. 观察者模式 概念介绍 观察者模式也被称作消息机制或发布-订阅者模式,为了解决主题对象与观察者之间功能的耦合. 观察者模式有一个消息容器,和三个方法,分别是订阅信息方法.取消订阅的信息方法.发送订阅的消息方法. 例如: /* * 将观察者放在闭包中,当页面加载就立即执行 */ const Observer = (function

ios业务模块间互相跳转的解耦方案

*此文章需有一点runtime的知识,假设你不了解runtime,<高速理解Runtime of Objective-C>: http://mp.weixin.qq.com/s?__biz=MzIxNDI0OTAzOQ==&mid=403005635&idx=1&sn=71375cb0dee51487c90087d488ff59fe#rd 问题: 一个app通常由很多个模块组成,全部模块之间免不了会相互调用,比如一个读书管理软件,可能会有书架.用户信息.图书详情等等模块

在Prism 框架中,实现主程序与模块间 UI 的通信

背景: 在模块的UI中包含 TreeView 控件,在该树形控件的每一节点前面定义了一个复选框,如图 需求: 在两个不同的应用程序中使用该控件,而它在不同应用程序中的外观则并不一致,按照本例,即一个显示复选框,一个不显示. 问题: 解决该问题的一个难处在于,Prism框架本身的设计原则——此 View 会被添加到主程序的 Shell 的 Region 中,所以在主程序中不能直接来控制该 View 的属性及其逻辑. 思路: 利用 EventAggregator 使得主程序与模块间进行通信,从而间接

第一次个人项目【词频统计】——需求分析,代码规范,设计思路

需求分析 由于程序需要在Windows平台和Linux平台都能运行,因此对代码的可移植性有一定的要求 由于需要对文件夹进行遍历,因此数据量相对较大,需要选择合适的数据结构,在此项目中,树和哈希表都是可供选择的数据结构 由于对字符串的处理很多,因此需要选择一种合适的字符串表达方式,char* or string? 代码规范 核心要求:用代码做到"卒章显志"的作用,代码能说清楚的事情就不要用注释,注释仅提示思路或者注意事项.因此变量名和函数名的设置尤为关键,比如函数名isSamePhras

C# WPF 一个设计界面

微信公众号:Dotnet9,网站:Dotnet9,问题或建议:请网站留言, 如果对您有所帮助:欢迎赞赏. C# WPF 一个设计界面 今天正月初三,大家在家呆着挺好,不要忘了自我充电. 武汉人民加油,今早又有噩耗,24号(8号)一路走好. 阅读导航 本文背景 代码实现 本文参考 源码 1. 本文背景 一个不错的界面设计 2. 代码实现 使用 .NET Framework 4.8 创建名为 "Dashboard1" 的WPF模板项目,添加3个Nuget库:MaterialDesignTh