外观模式Facade-实战dubbo rpc接口

Posted 长城守卫队长

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了外观模式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);
	}

 

 

以上是关于外观模式Facade-实战dubbo rpc接口的主要内容,如果未能解决你的问题,请参考以下文章

设计模式——外观模式

外观模式(Facade)

Facade——外观模式

外观模式(Facade Pattern)

外观模式(Facade Pattern)

外观(Facade)模式