背景:最近做了一个项目,平台适配多个三方广告商(app内部广告位),平台发出广告位大小、类型请求,三方接口返回广告。
为了满足不断增长的三方广告商(接口规格都不一样),我们在实现的时候采用工厂模式来进行适配。这也是我第一次在实战中使用工厂模式,感觉扩展性得到了很大的加强。
原理:基于Spring的ApplicationContextAware接口实现setApplicationContext方法。
源代码地址:https://github.com/qycwudi/rocketMQObject/tree/dev/1.0.0/design_patterns8092
beanName存储:数据库存放三方广告商基本信息,包括后台实现的bean。
实现时序图:
通过实现 setApplicationContext方法来根据name获取bean实例。
@Component
public class SpringIOCUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("===setApplicationContext===");
SpringIOCUtil.applicationContext = applicationContext;
}
public Object getBean(String beanName) {
Object object = null;
try {
object = applicationContext.getBean(beanName);
} catch (Exception e) {
System.out.println("没有找到");
} finally {
return object;
}
}
}
获取bean方法
public class FactoryMethod {
public static FactoryMethods init(String beanName){
SpringIOCUtil springIOCUtil = new SpringIOCUtil();
return (FactoryMethods)springIOCUtil.getBean(beanName);
}
}
service层
@Service
public class FactoryService extends ServiceImpl<FactoryMapper, FactoryInfo> {
public String operate(String id){
FactoryInfo factoryPojo = baseMapper.selectById(id);
if(factoryPojo==null){
return "没有记录";
}
FactoryMethods factoryMethods = FactoryMethod.init(factoryPojo.getBeanName());
try {
return factoryMethods.todo();
}catch (Exception e){
return "执行方法错误";
}
}
}
工厂接口
public interface FactoryMethods {
/**
* 工厂方法
*/
String todo();
}
后续扩展:
只需要继承FactoryMethods方法,实现todo接口来完成接口参数的适配,处理三方接口返回的数据。对数据格式进行统一返回。
DTO参数采用json的格式来进行传递,减少对表字段的修改,只动态添加实体类的字段即可。
JSONObject jsonObject = JSONUtil.parseObj(json); jsonObject.get("id")