1. 观察者模式 (Observer Pattern)

核心思想:定义一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当这个主题对象状态发生变化时,会通知所有观察者对象,使它们能够自动更新。

鸿蒙中的核心应用ArkUI状态管理是观察者模式最经典的体现。

  • 应用场景

    1. UI与数据的双向绑定:这是最根本的应用。当你使用 @State@Prop@Link@ObjectLink@Watch 等装饰器修饰变量时,你实际上就在声明:“UI视图(观察者)要观察这个数据(主题)的变化。”

    2. 自定义组件通信:父组件向子组件传递数据,并希望子组件在数据变化时更新。

    3. 全局状态管理:使用 AppStorage 或 LocalStorage 管理的应用全局状态,任何一个页面或组件(观察者)注入并依赖了该状态,都会在其变化时收到通知并重新渲染。

  • 具体代码示例

// 1. 主题(被观察者):用 @State 装饰的变量 count
@State count: number = 0;

// 2. 观察者:Text组件通过绑定表达式 `$r('app.string.count') ${this.count}` 观察 count
build() {
  Column() {
    // Text组件是观察者,监听count的变化
    Text($r('app.string.count') + `${this.count}`)
      .fontSize(50)
    Button('Click')
      .onClick(() => {
        // 3. 改变主题状态,通知所有观察者(Text)更新
        this.count++;
      })
  }
}

当你点击按钮,count 改变,ArkUI框架会自动通知所有用到 count 的地方(这里是Text组件)进行更新。这就是观察者模式的完美实践。

2. 策略模式 (Strategy Pattern)

核心思想:定义一系列的算法,将它们一个个封装起来,并且使它们可以相互替换。策略模式让算法独立于使用它的客户而变化。

鸿蒙中的核心应用将行为或算法抽象化,实现运行时动态切换。

  • 应用场景

    1. 网络请求策略:根据网络环境(Wi-Fi/4G)动态切换请求的超时时间、重试机制或图片加载质量(高清/标清)。不同的网络环境对应不同的“策略”。

    2. 数据验证策略:表单中输入框的校验规则可能不同(邮箱、手机号、密码)。可以定义统一的验证接口(Validator),然后为每种类型实现具体的策略类(EmailValidatorPhoneValidator)。

    3. 动画执行策略:一个动画组件可以根据用户交互或配置,动态切换不同的插值器(Curve),如 LinearEaseInSpring,每种插值器就是一种动画策略。

    4. 导航策略:根据不同设备(手机/平板/车机),同一操作可能对应不同的导航策略(跳转新页面、分屏、弹窗)。

  • 具体代码示例

// 1. 定义策略接口
interface ImageLoadStrategy {
  getImageUrl(originalUrl: string): string;
}

// 2. 实现具体策略
class WifiStrategy implements ImageLoadStrategy {
  getImageUrl(originalUrl: string): string {
    return originalUrl + “?quality=high”; // Wi-Fi下加载高清图
  }
}

class CellularStrategy implements ImageLoadStrategy {
  getImageUrl(originalUrl: string): string {
    return originalUrl + “?quality=low”; // 蜂窝网络下加载低清图
  }
}

// 3. 在使用的地方(如一个Image组件)
@State currentStrategy: ImageLoadStrategy = new WifiStrategy();

build() {
  Image(this.currentStrategy.getImageUrl(this.originalImageUrl))
    .onClick(() => {
      // 4. 运行时动态切换策略
      if (networkType === 'wifi') {
        this.currentStrategy = new WifiStrategy();
      } else {
        this.currentStrategy = new CellularStrategy();
      }
    })
}

3. 工厂模式 (Factory Pattern)

核心思想:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

鸿蒙中的核心应用封装复杂的对象创建过程,尤其在需要根据条件创建不同对象的场景。

  • 应用场景

    1. 创建复杂组件:根据后端返回的JSON数据类型(如:type: 'banner'type: 'productGrid'),动态创建不同的UI组件。一个ComponentFactory可以根据type来返回对应的自定义组件。

    2. 多设备UI创建:在跨端应用中,需要为手机、平板、手表创建不同的布局或组件。可以使用一个LayoutFactory,根据当前的设备类型(deviceType)来生成最适合的UI布局。

    3. 数据解析:根据不同的报文头或协议版本,使用不同的工厂创建对应的解析器(Parser)来处理网络返回的数据。

  • 具体代码示例

// 1. 定义组件接口(或基类)
interface BaseCardComponent {
  build(): void;
}

// 2. 实现具体组件
class BannerCard implements BaseCardComponent {
  build() {
    // 构建轮播图组件
  }
}

class NewsCard implements BaseCardComponent {
  build() {
    // 构建新闻卡片组件
  }
}

// 3. 创建工厂
class CardComponentFactory {
  static createCard(type: string): BaseCardComponent | null {
    switch (type) {
      case 'banner':
        return new BannerCard();
      case 'news':
        return new NewsCard();
      default:
        return null;
    }
  }
}

// 4. 使用工厂
@Provide cards: Array<BaseCardComponent> = [];

loadDataFromNetwork() {
  let data = ...; // 从网络获取数据
  data.forEach(item => {
    let card = CardComponentFactory.createCard(item.type);
    if (card) {
      this.cards.push(card);
    }
  });
}

4. 单例模式 (Singleton Pattern)

  • 核心思想:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

  • 在鸿蒙中的体现

    • AppStorage:全局唯一的应用级状态存储中心,符合单例模式的特征。

    • LocalStorage:页面级唯一的单例状态存储。

    • 自定义工具类:如日志管理类、网络请求库实例等,通常设计为单例以确保全局唯一。

5. 发布-订阅模式 (Publish-Subscribe Pattern)

  • 核心思想:一种消息范式,消息的发送者(发布者)不会将消息直接发送给特定的接收者(订阅者),而是通过消息通道广播出去,让订阅该消息类型的订阅者收到通知。

  • 在鸿蒙中的体现

    • emit / on 事件ItemComponent可以使用emit向父组件@Component发送事件,父组件使用on来订阅,这是一种发布-订阅。

    • 全局事件总线的实现:虽然鸿蒙没有直接提供,但开发者很容易基于此模式实现一个全局事件总线,用于跨层级、非父子组件的通信。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐