关于通过入参,省略if,调用接口实现不同的类

如果一个接口实现了不同的类,如何做到自动化配置的问题

未自动配置的方式如下

/**
     * 通过判断入参,确定调用哪个实现类
     * @param param
     * @return
     */
    @GetMapping("aa")
    public String aa(Integer param){
        if(param.equals(1)){
            tigerService.run("老虎");
        }
        if(param.equals(2)){
            lionService.run("狮子");
        }
        return "";
    }

缺点:可优化,多了if不够简洁

思路:

可以做个配置类,把参数和实现类绑在一起,通过调用接口,找到实现此接口对应的实现类,用以

实现自动配置查找

①新增配置类(入参与实现类之间)

/**
 * @author huyujie
 * @date 2023/7/7 10:05
 */
@Component
public class AutoConfig {

    public static Map<Integer, Class<? extends IRunService>> TYPE_CONFIG = MapUtil
            .builder(new HashMap<Integer, Class<? extends IRunService>>())
            .put(1, TigerServiceImpl.class)
            .put(2, LionServiceImpl.class)
            .build();

}

②调用接口(通过调用接口,以实现调用不同的类方法)

/**
     * 通过判断入参,确定调用哪个实现类
     *
     * @param param
     * @return
     */
    public String aa(Integer param) {
        try {
            Class<? extends IRunService> implClass = AutoConfig.TYPE_CONFIG.get(param);
            //查库,获取入参,假设查库完毕
            String result = "666";
            implClass.newInstance().run(result);

            //也可采取此种方式调用
            // IRunService iRunService = SpringUtil.getBean(implClass);
            //iRunService.run(result);

        } catch (Exception e) {
            log.error("未配置实现类:{}", e.getMessage());
            e.printStackTrace();
        }
        return "";
    }

③实现类内部编写

/**
 * 狮子实现类
 *
 * @author huyujie
 * @date 2023/7/7 9:47
 */
@Service
@Slf4j
public class LionServiceImpl implements IRunService {
    @Override
    public String run(String param) {
        return param + "狮子";
    }
}
/**
 * 老虎实现类
 *
 * @author huyujie
 * @date 2023/7/7 9:45
 */
@Service
@Slf4j
public class TigerServiceImpl implements IRunService {

    @Override
    public String run(String param) {
        return param + "跑步";
    }
}

### 如何在 UniApp 中通过多个文件实现接口调用 在 UniApp 项目中,为了更好地管理项目的复杂度并提高代码的可维护性和扩展性,通常会采用分层设计的方式将不同的功能模块分离出来。对于多个接口调用的情况,可以通过创建独立的服务文件夹和服务来组织这些接口逻辑。 以下是具体的实现方式: #### 文件组织结构建议 可以按照以下目录结构来组织服务和接口调用的相关代码: ``` ├── common/ │ ├── services/ // 存放所有的服务 │ │ ├── userService.js // 用户相关的接口 │ │ ├── productService.js // 商品相关的接口 │ │ └── fileService.js // 文件上传下载相关接口 │ ├── utils/ // 工具函数 │ │ └── request.js // 封装请求工具 └── pages/ // 页面组件 ``` #### 请求封装 首先,在 `common/utils/request.js` 中封装一个通用的 HTTP 请求工具,以便后续各服务文件复用此基础功能。 ```javascript // common/utils/request.js export default function request(options) { const { url, method = 'GET', data = {}, headers = {} } = options; return new Promise((resolve, reject) => { uni.request({ url, method, data, header: headers, success(res) { if (res.statusCode === 200 && res.data.code === 0) { resolve(res.data.result); } else { reject(new Error('Request failed')); } }, fail(err) { reject(err); } }); }); } ``` #### 接口实现 针对不同业务场景下的接口需求,可以在对应的 `.js` 文件中定义具体的方法。例如,假设我们需要处理用户信息、商品列表以及文件操作,则分别编写如下三个服务文件。 ##### 用户信息服务 (`userService.js`) ```javascript // common/services/userService.js import request from '../utils/request'; const BASE_URL = '/api/users'; export async function getUserInfo(userId) { try { const response = await request({ url: `${BASE_URL}/${userId}`, method: 'GET' }); return response; } catch (error) { console.error(error); throw error; } } export async function updateUserProfile(data) { try { const response = await request({ url: `${BASE_URL}/profile`, method: 'POST', data }); return response; } catch (error) { console.error(error); throw error; } } ``` ##### 商品信息服务 (`productService.js`) ```javascript // common/services/productService.js import request from '../utils/request'; const PRODUCT_API_BASE = '/api/products'; export async function fetchProductList(params) { try { const response = await request({ url: `${PRODUCT_API_BASE}`, method: 'GET', data: params }); return response; } catch (error) { console.error(error); throw error; } } export async function addNewProduct(productData) { try { const response = await request({ url: `${PRODUCT_API_BASE}`, method: 'POST', data: productData }); return response; } catch (error) { console.error(error); throw error; } } ``` ##### 文件服务 (`fileService.js`) ```javascript // common/services/fileService.js import request from '../utils/request'; const FILE_API_BASE = '/api/files'; export async function uploadFile(fileObj) { try { const formData = {}; Object.keys(fileObj).forEach(key => { formData[key] = fileObj[key]; }); const response = await request({ url: `${FILE_API_BASE}/upload`, method: 'POST', data: formData, headers: {'Content-Type': 'multipart/form-data'} }); return response; } catch (error) { console.error(error); throw error; } } export async function downloadFile(filePath) { try { const tempFilePath = await request({ url: filePath, responseType: 'arraybuffer' }); // 调用uni保存至本地方法 const result = await uni.saveFile({ tempFilePath: tempFilePath }); return result.savedFilePath; } catch (error) { console.error(error); throw error; } } ``` 以上实现了基于模块化的接口调用方案[^5],其中每个服务都专注于特定领域内的 API 访问逻辑,并且依赖于统一的请求工具完成实际通信过程。 #### 使用示例 当某个页面需要访问上述任意一种型的接口时,只需引对应的服务即可。例如在一个展示产品详情页里加载数据的同时允许用户修改头像的功能可能这样写: ```javascript <template> <!-- 省略模板 --> </template> <script> import { fetchProductDetail } from '@/common/services/productService'; import { updateAvatar } from '@/common/services/userService'; export default { methods: { async loadProduct(id){ this.product = await fetchProductDetail(id); }, async changeUserAvatar(event){ const avatarBlob = event.target.files[0]; let updatedUrl = await updateAvatar({avatar: avatarBlob}); alert(`Your new avatar has been set successfully! ${updatedUrl}`); } } }; </script> ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值