观察者模式推拉模型的区别
时间: 2024-06-15 07:05:48 浏览: 15
观察者模式是一种行为设计模式,用于在对象之间建立一对多的依赖关系,当一个对象的状态发生变化时,它的所有依赖对象都会收到通知并自动更新。观察者模式可以通过推模型和拉模型来实现。
推模型是指主题对象在状态变化时主动向观察者推送详细信息。在推模型中,主题对象通常会将自身的状态作为参数传递给观察者的更新方法。这样,观察者可以直接获取到主题对象的详细信息,并进行相应的处理。
拉模型是指主题对象在状态变化时只向观察者发送简单的通知,观察者需要自己主动去获取主题对象的详细信息。在拉模型中,主题对象通常只会将自身的引用传递给观察者的更新方法。观察者需要通过主题对象的引用来获取所需的信息。
区别:
1. 数据传递方式不同:推模型中,主题对象主动向观察者传递详细信息;拉模型中,主题对象只传递简单的通知,观察者需要自己获取详细信息。
2. 信息获取方式不同:推模型中,观察者可以直接获取到主题对象的详细信息;拉模型中,观察者需要通过主题对象的引用来获取所需的信息。
3. 灵活性不同:推模型中,主题对象需要知道观察者的具体细节,因此主题对象与观察者之间的耦合度较高;拉模型中,主题对象只需要提供一个接口给观察者使用,观察者可以根据自身需要选择获取哪些信息,因此主题对象与观察者之间的耦合度较低。
相关问题
RabbitMQ推拉模式java
RabbitMQ是一个消息中间件,支持推拉模式。在Java中使用RabbitMQ的方式如下:
1. 导入RabbitMQ的Java客户端库,可以使用Maven或Gradle等工具自动导入依赖。
2. 创建一个连接工厂对象,设置RabbitMQ服务器的地址和端口。
```
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setPort(5672);
```
3. 创建一个连接对象,使用连接工厂创建。
```
Connection connection = factory.newConnection();
```
4. 创建一个通道对象,使用连接对象创建。
```
Channel channel = connection.createChannel();
```
5. 声明一个队列,使用通道对象声明。
```
String queueName = "hello";
channel.queueDeclare(queueName, false, false, false, null);
```
6. 发送消息到队列中,使用通道对象发布消息。
```
String message = "Hello World!";
channel.basicPublish("", queueName, null, message.getBytes("UTF-8"));
```
7. 接收队列中的消息,创建一个消费者对象,使用通道对象消费消息。
```
Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
String message = new String(body, "UTF-8");
System.out.println("Received message: " + message);
}
};
channel.basicConsume(queueName, true, consumer);
```
以上就是使用RabbitMQ推拉模式的基本步骤。注意在使用完连接、通道等资源后需要及时关闭,以免资源泄漏。
RabbitMQ中@RabbitListener的推拉模式
RabbitMQ中的@RabbitListener注解可以用于监听队列中的消息,实现消费者的推拉模式。
在推模式中,消费者向RabbitMQ服务器注册监听器,当队列中有新消息时,RabbitMQ服务器会主动将消息推送给消费者,消费者只需要在监听器中处理消息即可。
在拉模式中,消费者通过轮询的方式从RabbitMQ服务器中获取消息,如果队列中有新消息,则消费者就会将消息从队列中取出并进行处理。
@RabbitListener注解默认使用的是推模式,即消费者向RabbitMQ服务器注册监听器,当队列中有新消息时,RabbitMQ服务器会主动将消息推送给消费者。如果需要使用拉模式,可以在@RabbitListener注解中添加属性:
- concurrency:指定消费者的并发数量,即同时处理多少个消息,默认为1。
- containerFactory:指定使用的RabbitMQ容器工厂,用于创建消息监听容器,默认为“simpleRabbitListenerContainerFactory”,即SimpleRabbitListenerContainerFactory。
使用@RabbitListener注解时,需要在配置类中添加@EnableRabbit注解开启RabbitMQ支持。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)