HarmonyOS 鸿蒙Next中观察者模式

HarmonyOS 鸿蒙Next中观察者模式

观察者模式

  1. 属于行为型模式,又叫做发布-订阅模式

定义 :对象间的一对多依赖关系,使得当一个对象(主题,Subject)状态改变时,所有依赖它的对象(观察者,Observer)都会自动收到通知并更新

具体主题:微信公众号
具体观察者:关注公众号的微信用户

优点:降低了主题和观察者的耦合关系 ,主题发送通知,所有的观察者都会收到 消息

缺点:观察者过多时,发送通知会耗时

JDK的内部实现

抽象主题类:Observable
Vector相当于List,

抽象观察者接口:Observe

使用场景:

  1. 当对象中存在一对多,一个对象的状态改变会影响其他对象的状态
  2. 当一个抽象模型有两个方面,其中一个方面依赖于另一个方面

更多关于HarmonyOS 鸿蒙Next中观察者模式的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

在HarmonyOS Next中,观察者模式通过@Observed@ObjectLink装饰器实现数据驱动UI更新。@Observed用于标记可观察类,@ObjectLink用于组件中引用可观察对象。当@Observed类的属性变化时,依赖@ObjectLink的组件会自动刷新。示例:

@Observed
class User {
  name: string = '';

  constructor(name: string) {
    this.name = name;
  }
}

@Entry
@Component
struct Index {
  @ObjectLink user: User;

  build() {
    Text(this.user.name)
  }
}

此机制替代传统回调方式,实现单向数据绑定。

更多关于HarmonyOS 鸿蒙Next中观察者模式的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中实现观察者模式,可以通过以下方式:

  1. 使用系统提供的EventBus机制:
  • 定义事件类继承CommonEventPublishInfo
  • 订阅者通过CommonEventManager.subscribe()注册
  • 发布者通过CommonEventManager.publish()发布事件
  1. 自定义实现观察者模式:
// 主题接口
interface Subject {
  registerObserver(observer: Observer): void;
  removeObserver(observer: Observer): void;
  notifyObservers(): void;
}

// 观察者接口
interface Observer {
  update(data: any): void;
}

// 具体主题实现
class ConcreteSubject implements Subject {
  private observers: Observer[] = [];
  private state: any;

  registerObserver(observer: Observer) {
    this.observers.push(observer);
  }

  removeObserver(observer: Observer) {
    const index = this.observers.indexOf(observer);
    if (index > -1) {
      this.observers.splice(index, 1);
    }
  }

  notifyObservers() {
    this.observers.forEach(observer => {
      observer.update(this.state);
    });
  }

  setState(newState: any) {
    this.state = newState;
    this.notifyObservers();
  }
}
  1. 在HarmonyOS中特有的实现方式:
  • 使用@Observed装饰器标记被观察对象
  • 使用@ObjectLink@Watch装饰器创建观察关系
  • 当被观察对象属性变化时自动触发UI更新

这种实现方式特别适合HarmonyOS的声明式UI开发范式,能高效地实现数据到UI的自动更新。

回到顶部