
1) 【一句话结论】:在移动端,推荐采用MVVM架构结合事件总线(解耦模块间通信)与依赖注入(管理模块依赖),通过明确职责和异步解耦,显著提升社交应用中消息与联系人模块的代码可维护性和扩展性。
2) 【原理/概念讲解】:老师口吻解释核心概念:
3) 【对比与适用场景】:
| 架构类型 | 核心组件 | 数据流向 | 通信方式 | 适用场景 |
|---|---|---|---|---|
| MVVM | View(UI)、ViewModel(逻辑)、Model(数据) | ViewModel→View(数据绑定),Model→ViewModel(数据更新) | 事件总线(ViewModel间)、观察者模式(Model→ViewModel) | 需要数据双向绑定,UI与逻辑解耦(如Android数据绑定、Jetpack Compose) |
| MVP | View(UI)、Presenter(逻辑)、Model(数据) | Presenter→View(更新UI),Model→Presenter(数据更新) | 回调接口(View→Presenter)、观察者(Model→Presenter) | 需要严格解耦,复杂业务逻辑(如传统Android开发,多线程处理) |
4) 【示例】:假设社交应用中,**联系人模块(ContactModule)与消息模块(MessageModule)**通信。伪代码:
ContactUpdateEvent。// 事件总线(EventBus)
public class ContactUpdateEvent {
private String contactId;
public ContactUpdateEvent(String contactId) { this.contactId = contactId; }
public String getContactId() { return contactId; }
}
// 联系人模块ViewModel
class ContactViewModel extends ViewModel {
private EventBus bus = new EventBus();
public void updateContact(String contactId) {
bus.post(new ContactUpdateEvent(contactId));
}
}
// 消息模块ViewModel
class MessageViewModel extends ViewModel {
private EventBus bus = new EventBus();
public MessageViewModel() {
bus.register(this);
}
@Subscribe
public void onContactUpdate(ContactUpdateEvent event) {
refreshMessageList(event.getContactId());
}
private void refreshMessageList(String contactId) {
messageRepository.getMessagesByContact(contactId).observe(this, messages -> {
messageAdapter.setNewData(messages);
});
}
}
5) 【面试口播版答案】:
面试官您好,关于移动端模块化架构,我主要从**架构选择(MVVM)和通信方式(事件总线+依赖注入)**来回答。首先,MVVM通过ViewModel封装业务逻辑,View负责展示,数据绑定实现View与ViewModel的解耦,比如在社交应用中,消息模块的ViewModel处理消息列表逻辑,而联系人模块的ViewModel处理联系人列表,两者通过事件总线通信。比如当用户在联系人模块修改了联系人信息,通过事件总线发布一个更新事件,消息模块订阅后刷新消息列表。依赖注入则用于管理模块间的依赖,比如用Hilt注入ViewModel,确保模块间依赖的解耦和可测试性。这样设计能提升代码的可维护性和扩展性,因为模块职责明确,修改一个模块不会影响其他模块。
6) 【追问清单】:
@Inject注解标记需要注入的对象,@Component配置依赖关系,自动管理对象生命周期,减少手动创建对象。LiveData或Flow结合ViewModel的onCleared()方法清理资源。LiveData/Flow结合协程,处理网络请求等异步操作,ViewModel在onCleared()中取消协程,避免内存泄漏;模块间通过事件总线传递异步结果,避免回调嵌套。7) 【常见坑/雷区】:
onCleared()方法中取消所有订阅。onCleared()中清理协程、数据库连接等资源。