场景1:没有依赖倒置的耦合代码
1. 定义具体的消息服务类
1 | // services/EmailService.js |
2. 在组件中直接依赖具体的服务
1 | <!-- components/NotificationComponent.vue --> |
场景1结论
假设你想从 EmailService 切换到 SMSService,你需要在组件代码中手动进行以下修改:
- 修改 import 语句,切换到新的服务类。
- 修改实例化代码,使用新的服务类创建实例。
- 修改所有调用代码,确保使用新的服务实例发送消息。
场景2:使用依赖倒置解耦合代码
1. 定义 MessageService 抽象接口
1 | // services/MessageService.js |
2. 定义具体的消息服务类
1 | // services/EmailService.js |
3. 在页面中提供消息服务
1 | <!-- page.vue --> |
4. 创建消息服务的组件
1 | <!-- components/NotificationComponent.vue --> |
场景2结论
解耦: 组件和服务实现之间是解耦的,组件只关心 MessageService 抽象接口,而不关心具体的实现。
灵活性: 可以轻松替换不同的服务实现而无需修改组件代码。
可测试性: 组件依赖于抽象接口,可以轻松地在测试中替换为模拟实现。