设计模式-外观模式

server/2024/9/23 10:22:17/

外观设计模式

定义

何为外观,就是对外提供一个统一的入口,一是可以隐藏系统内部的细节,二是可以降低使用者的复杂度,比如SpringMvc中的DispaterServlet,所有的Controller都是通过DispaterServlet统一暴露。

使用场景

降低使用者的复杂度,简化客户端的接入成本。

实践经验

有时候需要对外提供了一些开放能力给第三方ISV,比如设备管控、统一支付、对账单下载等能力,由于分属于不同的团队,所以对外提供的接口形式各异,初期还好,接口不多,ISV也能接受,但是后期接口多了ISV就开始抱怨接入成本太高,为了解决这一问题,在开放接口前面加了一层前端控制器GatewayController,其实就是后来开放平台的雏形,GatewayController对外统一暴露一个接口gateway.do,将对外接口的请求参数和响应参数统一在GatewayController做收敛,GatewayController往后端服务路由时也采用统一接口,改造前后对比如下图:

大概代码如下:

使用者:HttpClient.doPost("/gateway.do","{'method':'trade.create','sign':'wxxaaa','timestamp':'15311111111'},'bizContent':'业务参数'")GatewayController:
@RequestMapping("/gateway.do")
JSON gateway(HttpServletRequest req){   //1.组装开放请求OpenRequest openRequest = buildOpenRequest(req);   OpenResponse openResponse = null;   //2.请求路由if("trade.create".equals(openRequest.getMethod()){//proxy to trade service by dubboopenResponse = TradeFacade.execute(genericParam);   } else if("iot.message.push".equals(openRequest.getMethod()){//proxy to iot service by httpclientopenResponse = HttpClient.doPost('http://iot.service/generic/execute'genericParam);}   if(openResponse.isSuccess()){return {"code":"10000","bizContent":openResponse.getResult()};}else{return {"code":"20000","bizCode":openResponse.getCode()};}
}

总结

采用外观模式屏蔽了系统内部的一些细节,降低了使用者的接入成本,就拿GatewayController来说,ISV的鉴权,接口的验签等重复工作统一由它实现,ISV对接不同的接口只需要关心一套接口协议接口,由GatewayController这一层做了收敛。


http://www.ppmy.cn/server/6382.html

相关文章

大屏-flex布局

<div class"container"><div class"title">标题</div><div class"content"><div class"item"></div><div class"item" style"width: calc((100% - 30) / 3 * 2)"><…

专业143总分428学硕第一东南大学920专业基础综合考研经验电子信息与通信工程,海洋工程,电路系统,鲁汶,真题,大纲,参考书。

24考研基本已经尘埃落定&#xff0c;总归要为回忆留下点什么。回想起这一年的备考之路&#xff0c;至今仍觉得时间过得很快&#xff0c;有些感到恍惚&#xff0c;似乎不能接受。但是仔细思考一下&#xff0c;这一年经历了很多&#xff0c;走过很多弯路也取得一些阶段性的小成功…

使用Python制作读单词视频(含源码)

文章目录 1. 项目简介2. 项目使用2.1 功能介绍2.2 使用Colab生成视频 3. 项目原理介绍 1. 项目简介 项目源码地址&#xff1a;https://github.com/iioSnail/read_video_generation 我们经常在B站或其他视频网站上看到那种逐条读单词的视频&#xff0c;但他们的视频多多少少和…

缓存与数据库的数据一致性解决方案分析

在现代应用中&#xff0c;缓存技术的使用广泛且至关重要&#xff0c;主要是为了提高数据访问速度和优化系统整体性能。缓存通过在内存或更快速的存储系统中存储经常访问的数据副本&#xff0c;使得数据检索变得迅速&#xff0c;从而避免了每次请求都需要从较慢的主存储&#xf…

用Visualizer以热力图的方式表现中间特征图

首先&#xff0c;将网络模型中间特征图进行输出&#xff0c;保存为npy格式&#xff0c;&#xff08;vis_and_save_heatmap函数之前是计算Dice的函数&#xff09; import numpy as np import torch.optim from Load_Dataset import ValGenerator, ImageToImage2D from torch.ut…

Llama2模型本地部署(Mac M1 16G)

环境准备 环境&#xff1a;Mac M1 16G、Conda Conda创建环境配置 使用Anaconda-Navigator创建python 3.8环境 切换到新建的conda环境&#xff1a; conda activate llama38 llama.cpp 找一个目录&#xff0c;下载llama.cpp git clone https://github.com/ggerganov/llama.…

SkyWalking 为所有的API接口增加 tag

背景胡扯 线上接口报错&#xff0c;接着被 SkyWalking 抓到&#xff0c;然后 SkyWalking 触发告警&#xff0c;最后老板你&#xff0c;让你辛苦一下&#xff0c;在明早上班前把这个bug 改了&#xff0c;并告诉你你是全公司的希望。谁说不是呢&#xff1f;为公司业务保驾护航&a…

centos操作命令

CentOS操作命令包括但不限于以下几种&#xff1a; 系统操作命令&#xff1a; 关机、重启及登出&#xff1a; shutdown -h now&#xff1a;关闭系统。init 0 或 telinit 0&#xff1a;关闭系统。shutdown -r now&#xff1a;重启系统。reboot&#xff1a;重启系统。logout&…