跳到主要内容
版本:v6

Capacitor 插件抽象模式

为 Capacitor 构建的插件在复杂度上可能各不相同。以官方 Capacitor 插件为例:Toast 插件的 Android 实现较为简单,而推送通知则相当复杂,包含多个文件。

根据插件的复杂度和需求,将构建插件所需的工作范围视为一个独立的软件项目并不为过,特别是在 iOS 和 Android 的实现要求不同的情况下。

因此,有必要重温设计模式并回顾标准的 Capacitor 插件代码抽象方式。

设计模式基础

设计模式是软件设计中针对常见问题的通用、可复用解决方案。设计模式并非问题的编程解决方案,而是指导或蓝图,用于抽象代码以解决重复出现的问题。

即使您没有意识到,您很可能已经使用过设计模式。Angular 重度依赖依赖注入和单例模式。React 使用中介者和状态模式。推送通知使用观察者模式。

作为开发者,您应当有权力运用设计模式库来构建适合您 Capacitor 插件的代码抽象。

以下是一些描述并提供设计模式示例的优秀资源:

就个人而言,我会在项目规划阶段翻阅《Head First 设计模式》,并在埋头编写代码时浏览 Refactoring Guru。

实际应用中的模式

如果您浏览足够多的 Capacitor 插件源代码,会发现某些设计模式在 Capacitor 插件开发者中特别受欢迎。

桥接设计模式

桥接设计模式将代码的抽象与实现分离。这是一种将实现类封装在接口类内部的设计机制。

官方 Capacitor 插件大量使用桥接模式,以下来自设备插件的示例就是明证:

@objc func getLanguageCode(_ call: CAPPluginCall) {
let code = implementation.getLanguageCode()
call.resolve([ "value": code ])
}

为何这种设计模式如此适合 Capacitor 插件?

  • 您可以在抽象层面专注于高层逻辑,在实现层面专注于平台细节
  • 您可以向客户端隐藏实现细节
  • 您可以独立引入新的实现
  • 您可以创建平台无关的类和实现

外观设计模式

外观设计模式为包含许多移动部件的复杂子系统提供简单接口。它可能不会暴露子系统的所有功能,但会暴露客户端关心的特性。

一些更复杂的官方 Capacitor 插件使用外观模式,包括本地通知插件:

@Override
public void load() {
super.load();
notificationStorage = new NotificationStorage(getContext());
manager = new LocalNotificationManager();
manager.createNotificationChannel();
notificationChannelManager = new NotificationChannelManager(getActivity());
staticBridge = this.bridge;
}

为何这种设计模式适合 Capacitor 插件?

  • 您可以将代码与子系统的复杂性隔离
  • 您可以保护客户端代码免受子系统代码变更的影响
  • 您可以将子系统结构分层

屏幕方向插件将采用哪种模式?

ScreenOrientation 插件将使用桥接设计模式。虽然我们尚未涉及实现插件功能所需的底层 iOS 和 Android API,但正如您将在下一步(iOS 实现)中看到的,实现插件 API 是直接且相对简单的。