组件化是如何进行通信的

devtools/2024/12/22 9:25:00/

目录

  • 1.接口(Interface)
  • 2.事件总线([Event Bus](https://blog.csdn.net/Sh_12345/article/details/131623985))
  • 3. 服务(Service)
  • 4.消息队列(Message Queue)
  • 5.依赖注入(Dependency Injection)

组件化是一种常见的设计方法,它 将应用程序分解为独立的、可重用的组件组件化之间的通信是实现模块化应用程序的关键。

模块化与组件化

1.接口(Interface)

描述
使用接口定义组件之间的通信契约。每个组件实现这些接口,从而实现解耦和灵活性
示例

public interface CommunicationInterface {void sendMessage(String message);
}public class ComponentA {private CommunicationInterface communicationInterface;public ComponentA(CommunicationInterface communicationInterface) {this.communicationInterface = communicationInterface;}public void performAction() {communicationInterface.sendMessage("Hello from ComponentA");}
}public class ComponentB implements CommunicationInterface {@Overridepublic void sendMessage(String message) {System.out.println("ComponentB received: " + message);}
}// 使用
ComponentB componentB = new ComponentB();
ComponentA componentA = new ComponentA(componentB);
componentA.performAction();

2.事件总线(Event Bus)

描述
使用事件总线(如 EventBus、RxJava)来发布和订阅事件,从而实现组件间的解耦
通信

// 使用 EventBus
EventBus.getDefault().post(new MessageEvent("Hello from ComponentA"));// 订阅事件
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {System.out.println("Received message: " + event.message);
}// 注册和注销
@Override
public void onStart() {super.onStart();EventBus.getDefault().register(this);
}@Override
public void onStop() {super.onStop();EventBus.getDefault().unregister(this);
}

3. 服务(Service)

描述
使用服务(如 Android 的 Service)来实现组件间的通信,特别是当组件运行在不同的进程中时。

// 定义服务
public class CommunicationService extends Service {private final IBinder binder = new LocalBinder();public class LocalBinder extends Binder {CommunicationService getService() {return CommunicationService.this;}}@Overridepublic IBinder onBind(Intent intent) {return binder;}public void sendMessage(String message) {// 处理消息}
}// 在组件中绑定服务
Intent intent = new Intent(this, CommunicationService.class);
bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);private ServiceConnection serviceConnection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {CommunicationService.LocalBinder binder = (CommunicationService.LocalBinder) service;CommunicationService communicationService = binder.getService();communicationService.sendMessage("Hello from ComponentA");}@Overridepublic void onServiceDisconnected(ComponentName name) {// 服务断开处理}
};

4.消息队列(Message Queue)

描述
使用消息队列(如 RabbitMQ、Kafka)来实现异步通信,适用于分布式系统中的组件通信

// 使用 RabbitMQ 发送消息
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (Connection connection = factory.newConnection();Channel channel = connection.createChannel()) {channel.queueDeclare("queue_name", false, false, false, null);String message = "Hello from ComponentA";channel.basicPublish("", "queue_name", null, message.getBytes());
}// 使用 RabbitMQ 接收消息
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (Connection connection = factory.newConnection();Channel channel = connection.createChannel()) {channel.queueDeclare("queue_name", false, false, false, null);DeliverCallback deliverCallback = (consumerTag, delivery) -> {

5.依赖注入(Dependency Injection)

描述
使用依赖注入框架(如 Dagger、Spring)将组件的依赖关系注入到组件中,从而实现松耦合。

// 使用 Dagger 进行依赖注入
@Component
public interface AppComponent {void inject(ComponentA componentA);void inject(ComponentB componentB);
}@Module
public class AppModule {@Providespublic CommunicationInterface provideCommunicationInterface() {return new ComponentB();}
}// 在应用程序中初始化
AppComponent appComponent = DaggerAppComponent.create();
appComponent.inject(componentA);
appComponent.inject(componentB);

http://www.ppmy.cn/devtools/107733.html

相关文章

9. GIS技术支持工程师岗位职责、技术要求和常见面试题

本系列文章目录: 1. GIS开发工程师岗位职责、技术要求和常见面试题 2. GIS数据工程师岗位职责、技术要求和常见面试题 3. GIS后端工程师岗位职责、技术要求和常见面试题 4. GIS前端工程师岗位职责、技术要求和常见面试题 5. GIS工程师岗位职责、技术要求和常见面试…

leetcode209. Minimum Size Subarray Sum

题目 Given an array of positive integers nums and a positive integer target, return the minimal length of a subarray whose sum is greater than or equal to target. If there is no such subarray, return 0 instead. Example 1: Input: target 7, nums [2,3,1,…

209.长度最小的子数组

题目 链接:leetcode链接 思路分析(滑动窗口) 1、为什么会想到使用滑动窗口呢? 首先,子数组是连续的,第二,所有的元素都是正整数,所以子数组的和具有单调性。 所以,对…

进程

进程 进程进程的含义PCB块内存空间进程分类:进程的作用进程的状态进程已经准备好执行,所有的资源都已分配,只等待CPU时间进程的调度 进程相关命6.查询进程相关命令1.ps aux2.top3.kill和killall发送一个信号 函数1.fork();2.getpid3.getppid示…

一台手机一个ip地址吗?手机ip地址泄露了怎么办

在数字化时代,‌手机作为我们日常生活中不可或缺的一部分,‌其网络安全性也日益受到关注。‌其中一个常见的疑问便是:‌“一台手机是否对应一个固定的IP地址?‌”实际上,‌情况并非如此简单。‌本文首先解答这一问题&a…

一个webpack的plugin 的简单例子

下面是一个简单的 Webpack 插件示例,该插件会在输出目录中创建一个文本文件,并向其中写入当前的时间戳。这个插件演示了如何注册一个监听器,在编译完成之后执行自定义的操作。 首先,你需要创建一个 JavaScript 文件来定义你的插件…

后台框架-统一数据格式

现在BS架构的应用一般都采用前后端分离的架构,前端技术框架可采用VUE等,后端框架目前成熟且使用广泛的就是基于SpringBoot开发的后端微服务框架。 数据格式 这里主要介绍一下如何实现返回统一的数据格式,比如返回的样例数据如下图所示&…

【Starter 】Spring Boot 3.x 自定义封装Starter 实战

【Starter 】Spring Boot 3.x 自定义封装Starter 实战 Starter 背景简介及作用 什么是 Starter Starter 是 Spring Boot 中的一项创新发明,它的主要作用是降低项目开发中的复杂性,从而简化开发操作。通过使用 Starter,开发人员可以轻松地引…