跨平台开发对于不同平台调用接口的抽象层设计

我已经受够无处不在的分支语句了!
长痛不如短痛,趁现在的底层交互代码还没有这么多,赶紧重构吧。毕竟不是 demo 时期了,要讲究一些了

设计思路

刚开始的想法是整一个抽象类 AbstractAPIs 声明所有待实现的函数,然后让各个平台去具体的实现 PlatformAAPIs、PlatformBAPIs

突然想到 Js 好像没有抽象类,不好意思 TypeScript 写的有点多。。。

如果手动模拟抽象类,如果没被子类覆盖抛异常。这种方式代码量有点太多了,一百多个接口,每个都一样的代码,实在是不优雅

其实抽象类的作用就是起到一个注册的作用,注册存在这么一些方法可供使用。对于这样的注册,没必要真的将其结构化为类,只需要抛出一个对象即可

export default {methodName1: "methodName1",methodName2: "methodName2",methodName3: "methodName3",
}

使用时根据字符串来调用

apis.call(FUNCNAMES.methodName1)

结构框架

platform1.js

class Platform1 {methodName1() { // 实现 }methodName2() { // 实现 }methodName3() { // 实现 }
}
export default new Platform1();

platform2.js

class Platform1 {methodName1() { // 实现 }methodName2() { // 实现 }methodName3() { // 实现 }
}
export default new Platform2();

api.js

import platformA from "./platformA";
import platformB from "./platformB";class Apis {this.instance = window.isPlarformA() ? platformA : platformB;call = (funcName) => {return this.instance[funcName]();}
}export default new Apis();

添加参数支持

当然,调用时不仅有函数名,还有参数,这个要怎么处理呢
apis.call 完全可以仿照 js 的 call,就是 call、apply 那一套的 call,将 params 直接附在后边

apis.call(FUNCNAMES.methodName1, param1, param2, param3...)

在实现 call 的时候解构赋值即可

call = (funcName, ...args) => {return this.instance[funcName](...args);
};

最终实现

class APIs {constructor() {this.bInit = false;this.instance = null;}init = () => {this.bInit = true;this.instance = window.isPlarformA() ? platformA : platformB;};call = (funcName, ...args) => {if (!this.bInit) this.init();if (this.instance[funcName]) {return this.instance[funcName](...args);} else {throw new Error(`[APIs::call][${funcName}] no instance[funcName].`);}};
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/59216.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTMLCSS:打造酷炫下载安装模拟按钮

效果演示 这段代码通过HTML和CSS创建了一个具有交互效果的下载按钮&#xff0c;当复选框被选中时&#xff0c;会触发一系列动画和样式变化&#xff0c;模拟了一个下载和安装的过程&#xff0c;包括圆形的动画、文本的显示和隐藏等。 HTML <div class"container&quo…

Multi Agents协作机制设计及实践

01 多智能体协作机制的背景概述 在前述博客中&#xff0c;我们利用LangChain、AutoGen等开发框架构建了一个数据多智能体的平台&#xff0c;并使用了LangChain的Multi-Agents框架。然而&#xff0c;在实施过程中&#xff0c;我们发现现有的框架存在一些局限性&#xff0c;这些…

ML2001-1 机器学习/深度学习 Introduction of Machine / Deep Learning

图片说明来自李宏毅老师视频的学习笔记&#xff0c;如有侵权&#xff0c;请通知下架 影片参考 【李宏毅】3.第一节 - (上) - 机器学习基本概念简介_哔哩哔哩_bilibili 1. 机器学习的概念与任务类型 概念&#xff1a;机器学习近似于寻找函数&#xff0c;用于处理不同类型的任…

90%会展主办方都会用的6款数字化工具

在会展行业&#xff0c;数字化转型已成为提升竞争力的关键。面对日益增长的运营成本和收入增长的瓶颈&#xff0c;主办方需要借助数字化工具来实现效率提升和成本控制。 今天介绍几种常见的数字化工具和应用方式。 一、线上展览平台 构建线上展览平台是会展主办方拓展线上销…

技术速递|GitHub Copilot upgrade assistant for Java 技术预览发布!

作者&#xff1a;Nick Zhu - Senior Program Manager 排版&#xff1a;Alan Wang 随着人工智能和大型语言模型&#xff08;LLMs&#xff09;的不断发展&#xff0c;Agent&#xff08;“智能代理”&#xff09;和智能代理化工作流程正在迅速成为AI领域的下一个前沿。这些自主系统…

Python常用脚本集锦

收集了一些常用Python脚本&#xff0c;作为平时练手使用&#xff0c;也可以作为自己的笔记&#xff0c;用到哪个功能可以自己查询一下即可。 文件和目录管理 复制文件 import shutil# 复制源文件到目标文件 shutil.copy(source.txt, destination.txt)移动文件 import shuti…

redis源码系列--(二)--multi/exec/eval命令执行流程

本文主要记录multi/exec、eval、redis执行lua脚本的源码流程 redis在exec之前&#xff0c;所有queued的命令是没有执行的&#xff0c;&#xff01;&#xff01;&#xff01;在执行时会通过检测client是否被打上CLIENT_DIRTY_CAS标记来判断[watch后,exec时]时间段内是否有key被…

什么是安全威胁情报?

SANS的定义 针对安全威胁、威胁者、利用、恶意软件、漏洞和危害指标、所收集的用于评估的应用数据集。 iSight的定义 iSight&#xff1a;网络威胁情报是关于已收集、分析、分发的&#xff0c;针对攻击者和其动机的目的手段&#xff0c;用于帮助所有安全级别的&#xff0c;和…

JMeter快速造数之数据导入导出

导入数据 输入表格格式如下 创建CSV Data Set Config 在Body Data中调用 { "username": "${email}", "password": "123456", "client_id": "00bb9dbfc67439a5d42e0e19f448c7de310df4c7fcde6feb5bd95c6fac5a5afc"…

渗透测试-快速获取目标中存在的漏洞(小白版)

《Java代码审计》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484219&idx1&sn73564e316a4c9794019f15dd6b3ba9f6&chksmc0e47a67f793f371e9f6a4fbc06e7929cb1480b7320fae34c32563307df3a28aca49d1a4addd&scene21#wechat_redirect 《Web安全》h…

[免费]基于Python的Django+Vue3在线考试系统【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的基于Python的DjangoVue3在线考试系统&#xff0c;分享下哈。 项目视频演示 【免费】基于Python的DjangoVue3在线考试系统 Python毕业设计_哔哩哔哩_bilibili 项目介绍 本论文提出并实现了一种基于Python…

Unity3D学习FPS游戏(9)武器音效添加、创建敌人模型和血条

前言&#xff1a;虽然已经实现了基本玩家操作&#xff0c;但是游戏运行起来并没有音效。既然是FPS游戏有了玩家和武器&#xff0c;肯定还得有敌人。本篇演示如何给武器添加音效和创建敌人。 武器音效添加和创建敌人 武器音效添加Audio Source代码控制 创建敌人目标敌人模型敌人…

C 语言编程中的常见错误及解决方案

在 C 语言开发中&#xff0c;编译和链接错误是常见的问题&#xff0c;尤其是在处理多个源文件时。本文将总结一些常见的错误&#xff0c;并提供相应的解决方案&#xff0c;以帮助开发者更高效地排查和修复这些问题。 1. 结构体作用域问题 问题描述 在函数参数列表中定义结构体…

Kubernetes运行大数据组件-运行spark

在Kubernetes上运行Spark作业&#xff0c;你需要创建一个Spark的部署和相应的Kubernetes资源。以下是一个简化的例子&#xff0c;展示了如何使用Kubernetes部署Spark Driver和Executor。 首先&#xff0c;确保你有一个运行中的Kubernetes集群&#xff0c;并且kubectl 命令行工…

雷池社区版新版本功能防绕过人机验证解析

前两天&#xff0c;2024.10.31&#xff0c;雷池社区版更新7.1版本&#xff0c;其中有一个功能&#xff0c;新增请求防重放 更新记录&#xff1a;hhttps://docs.waf-ce.chaitin.cn/zh/%E7%89%88%E6%9C%AC%E6%9B%B4%E6%96%B0%E8%AE%B0%E5%BD%95 仔细研究了这个需求&#xff0c;…

PyCharm中pylint安装与使用

目录 1. 安装插件2. pycharm中使用该功能3. 命令行使用 1. 安装插件 然后重启 2. pycharm中使用该功能 3. 命令行使用 前提是先 pip install pylint pylint demo01.py下面红框内容的意思是&#xff0c;得到10分/ 满分10分&#xff0c;上次运行获得8.33分&#xff0c;经调整…

conda下安装volitility3

在github下载zip压缩包并解压。 创建虚拟环境 (base) C:\WINDOWS\system32>conda create -n volatility3 python3.8 激活虚拟环境 (base) C:\WINDOWS\system32>conda activate volatility3 安装工具所需要的依赖 (volatility3) C:\WINDOWS\system32>cd /d D:\CT…

IDEA加载通义灵码插件及使用指南

安装通义灵码插件 登录通义灵码IDE插件 下载登录参考教程 https://help.aliyun.com/zh/lingma/user-guide/download-the-installation-guide 本地工程和企业知识库准备 请下载本地工程和知识库压缩包&#xff0c;并在本地解压缩&#xff0c;其中包含demoProject和知识库文件…

Java入门(7)--网络编程

Java网络编程&#xff1a;构建网络应用的基石 &#x1f310; &#x1f3af; 掌握Java网络编程&#xff0c;打造强大的网络应用&#xff01; 在上一篇文章中&#xff0c;我们探讨了Java的I/O操作和反射机制。今天&#xff0c;让我们深入学习Java网络编程&#xff0c;了解如何构建…

只因把 https 改成 http,带宽减少了 70%!

起因 是一个高并发的采集服务上线后&#xff0c;100m的上行很快就被打满了。因为这是一条专线&#xff0c;并且只有这一个服务在使用&#xff0c;所以可以确定就是它导致的。 但是&#xff01;这个请求只是一个 GET 请求&#xff0c;同时并没有很大的请求体&#xff0c;这是为…