鸿蒙开发中常用的设计模式及应用详解
1. 观察者模式 (Observer Pattern)
核心思想:定义一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当这个主题对象状态发生变化时,会通知所有观察者对象,使它们能够自动更新。
鸿蒙中的核心应用:ArkUI状态管理是观察者模式最经典的体现。
-
应用场景:
-
UI与数据的双向绑定:这是最根本的应用。当你使用
@State,@Prop,@Link,@ObjectLink,@Watch等装饰器修饰变量时,你实际上就在声明:“UI视图(观察者)要观察这个数据(主题)的变化。” -
自定义组件通信:父组件向子组件传递数据,并希望子组件在数据变化时更新。
-
全局状态管理:使用
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)
核心思想:定义一系列的算法,将它们一个个封装起来,并且使它们可以相互替换。策略模式让算法独立于使用它的客户而变化。
鸿蒙中的核心应用:将行为或算法抽象化,实现运行时动态切换。
-
应用场景:
-
网络请求策略:根据网络环境(Wi-Fi/4G)动态切换请求的超时时间、重试机制或图片加载质量(高清/标清)。不同的网络环境对应不同的“策略”。
-
数据验证策略:表单中输入框的校验规则可能不同(邮箱、手机号、密码)。可以定义统一的验证接口(
Validator),然后为每种类型实现具体的策略类(EmailValidator,PhoneValidator)。 -
动画执行策略:一个动画组件可以根据用户交互或配置,动态切换不同的插值器(
Curve),如Linear,EaseIn,Spring,每种插值器就是一种动画策略。 -
导航策略:根据不同设备(手机/平板/车机),同一操作可能对应不同的导航策略(跳转新页面、分屏、弹窗)。
-
-
具体代码示例:
// 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)
核心思想:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
鸿蒙中的核心应用:封装复杂的对象创建过程,尤其在需要根据条件创建不同对象的场景。
-
应用场景:
-
创建复杂组件:根据后端返回的JSON数据类型(如:
type: 'banner',type: 'productGrid'),动态创建不同的UI组件。一个ComponentFactory可以根据type来返回对应的自定义组件。 -
多设备UI创建:在跨端应用中,需要为手机、平板、手表创建不同的布局或组件。可以使用一个
LayoutFactory,根据当前的设备类型(deviceType)来生成最适合的UI布局。 -
数据解析:根据不同的报文头或协议版本,使用不同的工厂创建对应的解析器(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来订阅,这是一种发布-订阅。 -
全局事件总线的实现:虽然鸿蒙没有直接提供,但开发者很容易基于此模式实现一个全局事件总线,用于跨层级、非父子组件的通信。
-
更多推荐

所有评论(0)