本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新
在鸿蒙(HarmonyOS)开发中,分层架构设计是提升代码复用性、可维护性和跨设备适配能力的关键。
一、鸿蒙分层架构核心思想
1. 推荐分层模型(三层架构)
层级 | 职责 | 技术实现 | 对应目录 |
---|---|---|---|
表现层(UI) | 处理设备差异化UI渲染和交互逻辑 | ArkUI声明式开发、响应式布局 | entry/src/main/ets/pages/ |
领域层(Domain) | 核心业务逻辑和数据处理 | 状态管理、Service Ability | features/模块名/ |
数据层(Data) | 数据获取与持久化 | 数据库、网络请求、分布式数据管理 | common/data/ |
2. 跨层通信原则
- 单向数据流:数据层 → 领域层 → 表现层(通过
@State
/@Prop
/@Link
传递)。 - 依赖倒置:高层模块不直接依赖低层实现,通过接口抽象(如
Repository
模式)。
二、分层实现与示例
1. 数据层(Data Layer)
职责:统一管理数据源(本地、网络、设备间同步)。
常用API与工具
功能 | API/组件 | 说明 |
---|---|---|
本地数据库 | @ohos.data.relationalStore | 关系型数据库操作 |
网络请求 | @ohos.net.http | 封装HTTP请求 |
分布式数据 | @ohos.distributedKVStore | 跨设备数据同步 |
数据缓存 | @ohos.data.preferences | 轻量级键值存储 |
示例:数据仓库封装
// common/data/repository/UserRepository.ts
import { relationalStore } from '@ohos.data.relationalStore';
import { http } from '@ohos.net.http';
export class UserRepository {
private db: relationalStore.RdbStore;
constructor() {
this.initDB();
}
// 初始化数据库
private async initDB() {
const config = { name: 'user.db' };
this.db = await relationalStore.getRdbStore(this.context, config);
}
// 网络请求获取用户数据
async fetchUserFromRemote(userId: string): Promise<User> {
let httpRequest = http.createHttp();
let response = await httpRequest.request(`https://api.example.com/users/${userId}`);
return JSON.parse(response.result.toString());
}
// 本地存储用户数据
async saveUser(user: User): Promise<void> {
await this.db.insert('user_table', user);
}
}
2. 领域层(Domain Layer)
职责:处理业务逻辑,协调数据层与表现层。
核心设计模式
- 用例(UseCase):封装单一业务逻辑。
- 依赖注入(DI):通过构造函数注入数据层实例。
示例:用户登录用例
// features/account/usecase/LoginUseCase.ts
import { UserRepository } from '../../../common/data/repository/UserRepository';
export class LoginUseCase {
constructor(private userRepo: UserRepository) {}
async execute(username: string, password: string): Promise<boolean> {
const user = await this.userRepo.fetchUserFromRemote(username);
if (user.password === password) {
await this.userRepo.saveUser(user);
return true;
}
return false;
}
}
3. 表现层(UI Layer)
职责:渲染UI并处理用户交互。
常用API与组件
功能 | API/组件 | 说明 |
---|---|---|
状态管理 | @State , @Prop , @Link | 组件内状态管理 |
页面路由 | @ohos.router | 跨页面导航 |
响应式布局 | GridRow , GridCol , mediaQuery | 多端UI适配 |
示例:登录页面
// entry/src/main/ets/pages/LoginPage.ets
import { LoginUseCase } from '../../../features/account/usecase/LoginUseCase';
import { UserRepository } from '../../../common/data/repository/UserRepository';
@Entry
@Component
struct LoginPage {
@State username: string = '';
@State password: string = '';
private loginUseCase: LoginUseCase = new LoginUseCase(new UserRepository());
build() {
Column() {
TextInput({ placeholder: '用户名' })
.onChange((value: string) => this.username = value)
TextInput({ placeholder: '密码', type: InputType.Password })
.onChange((value: string) => this.password = value)
Button('登录')
.onClick(async () => {
const success = await this.loginUseCase.execute(this.username, this.password);
if (success) {
router.pushUrl({ url: 'pages/HomePage' });
}
})
}
}
}
三、分层架构的鸿蒙特性适配
1. 多设备UI适配
- 资源分级:在
resources/base/
和resources/[device-type]/
中存放差异化资源。 - 条件渲染:通过
@Builder
和if-else
实现设备专属UI。@Builder deviceSpecificButton() { if (deviceInfo.deviceType === 'phone') { Button('手机按钮').width('100%') } else { Button('平板按钮').width('50%') } }
2. 跨设备能力调用
- 分布式Service Ability:通过
featureAbility.connectService()
调用其他设备的服务。// 连接智慧屏的播放服务 const connectionId = featureAbility.connectService( { deviceId: '123', bundleName: 'com.smarttv', abilityName: 'PlayService' }, (err, data) => {} );
四、总结
-
依赖注入优化 使用
@Inject
装饰器(需配合DI框架如ohos/di
)解耦模块:@Inject private userRepo: UserRepository;
-
性能监控 通过
@ohos.hiviewdfx.hiTraceMeter
跟踪跨层调用耗时:hiTraceMeter.startTrace('login_use_case', 1000); await loginUseCase.execute(); hiTraceMeter.finishTrace('login_use_case');
-
分层调试
- 数据层:使用
hdc
命令行工具直接操作数据库:hdc shell aa dump -a com.example.app | grep 'RdbStore'
- 领域层:编写单元测试验证业务逻辑(使用
ohos/unitTest
)。
- 数据层:使用
五、完整项目结构示例
myApp/
├── common/ # 公共层
│ ├── data/ # 数据层实现
│ │ ├── repository/ # 数据仓库
│ │ └── model/ # 数据模型
│ └── utils/ # 工具类
├── features/ # 领域层
│ ├── account/ # 账号模块
│ │ ├── usecase/ # 业务用例
│ │ └── service/ # 领域服务
├── entry/ # 表现层
│ ├── src/main/ets/
│ │ ├── pages/ # 页面组件
│ │ └── components/ # 共享UI组件
└── resources/ # 多端资源
├── base/
└── tablet/