【设计模式】外观模式Facade-实战dubbo rpc接口

1.什么是外观设计模式:

外观模式(Facade):其中Facade是外观角色,也叫门面角色,客户端可以调用这个接口的方法(客户端并不需要知道这个接口怎么实现的),此接口知晓子系统的所有功能和责任,将客户端的请求代理给适当的子系统对象;Subsystem是子系统角色,可以同时拥有一个或多个子系统,每一个子系统都不是一个单独的类,而是一个类的集合,子系统并不知道门面的存在。

2.什么时候使用外观设计模式:

根据我10 多年的互联网开发经验:外观设计模式主要使用在dubbo 的rpc接口,或者springCloud的Feign接口,比如我们调用 dubbo rpc接口,或者是springCloud的feign接口,我们只需要知道这个接口返回的信息,并不关心接口里面的实现,实现类里面调用了那个service和是否调用其他的系统或者是第三方接口。

3.以dubbo为例带你实战外观设计模式:

以上传文件为案例:

首先我们定义一个dubbo的api接口,此接口在api包,供其他工程使用:

public interface IUploadFileFacade {

	/**
	 * 上传附件
	 * 
	 * @param fileName
	 *            文件的真实名字
	 * @param ossFileName
	 *            oss的文件名称
	 * @param filePath
	 *            oss的文件地址
	 * @param source
	 *            文件来源
	 * @return
	 */
	CommonResult<UploadFileDto> upload(String fileName, String ossFileName, String filePath, EnumUploadFileSource source);
}

接下来我们来编写dubbo-api接口的实现,就是业务逻辑层,我们发现facade的实现层是 调用了其他的service:

看一下包目录结构:

@Service//dubbo 的@Service注解
public class UploadFileFacade implements IUploadFileFacade {

	private static final Logger LOGGER = LoggerFactory.getLogger(UploadFileFacade.class);

	@Resource
	private IUploadFileService uploadFileService;

	@Override
	public CommonResult<UploadFileDto> upload(String fileName, String ossFileName, String filePath,
			EnumUploadFileSource source) {
		CommonResult<UploadFileDto> result;
		try {
			UploadFileEntity entity = new UploadFileEntity(source.getCode(), fileName, ossFileName, filePath);
			uploadFileService.insert(entity);
			result = new CommonResult<>(build(entity));
		} catch (Exception e) {
			LOGGER.error("upload-->params: fileName={}, filePath={}, source={}", fileName, filePath, source, e);
			result = new CommonResult<>(SysExceptionMessage.SYS_ERROR);
			if (e instanceof CommonException) {
				result = new CommonResult<>(CommonMessage.getEnum(((CommonException) e).getStatus()));
			}
		}
		return result;
	}
}

此时我们发现,调用这个在使用 api接口的时候,只需要注入:IUploadFileFacade  ,并不关心,UploadFileFacade 的具体实现,调用了那些service接口:

@Resource
private IUploadFileFacade uploadFileFacade;

public CommonResult<UploadFileDto> uploadFile(MultipartFile file,
												  Integer source, String key) throws Exception {

		// 1.上传oss,返回filePath
		String fileName = XXX;
		String prefix = XXX;
		String ossFileName = XXX;
		EnumUploadFileSource enumUploadFileSource = EnumUploadFileSource.getEnumByCode(source);
		String url = ossService.fileUpload(enumUploadFileSource.getOssPath() + ossFileName, file.getInputStream());
		// 2.调用uploadFileFacade,存储数据
		CommonResult<UploadFileDto> apiResult = uploadFileFacade.upload(fileName, ossFileName, url.replaceAll(INTERNAL, ""), enumUploadFileSource);
		UploadFileDto dto = ResultCheckUtil.check(apiResult);
		return new CommonResult<>(dto);
	}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值