首页 > 其他分享 >设计模式之观察者模式

设计模式之观察者模式

时间:2023-02-19 22:26:32浏览次数:32  
标签:订阅 调度 模式 观察者 import 设计模式 event

spring的观察者模式demo

1.观察者模式与发布与订阅模式对比:

观察者模式

比较概念的解释是,目标和观察者是基类,目标提供维护观察者的一系列方法,观察者提供更新接口。具体观察者和具体目标继承各自的基类,然后具体观察者把自己注册到具体目标里,在具体目标发生变化时候,调度观察者的更新方法。

比如有个“天气中心”的具体目标A,专门监听天气变化,而有个显示天气的界面的观察者B,B就把自己注册到A里,当A触发天气变化,就调度B的更新方法,并带上自己的上下文。

img

发布/订阅模式

比较概念的解释是,订阅者把自己想订阅的事件注册到调度中心,当该事件触发时候,发布者发布该事件到调度中心(顺带上下文),由调度中心统一调度订阅者注册到调度中心的处理代码。

比如有个界面是实时显示天气,它就订阅天气事件(注册到调度中心,包括处理程序),当天气变化时(定时获取数据),就作为发布者发布天气信息到调度中心,调度中心就调度订阅者的天气处理程序。

img

总结

  1. 从两张图片可以看到,最大的区别是调度的地方。

虽然两种模式都存在订阅者和发布者(具体观察者可认为是订阅者、具体目标可认为是发布者),但是观察者模式是由具体目标调度的,而发布/订阅模式是统一由调度中心调的,所以观察者模式的订阅者与发布者之间是存在依赖的,而发布/订阅模式则不会。

  1. 两种模式都可以用于松散耦合,改进代码管理和潜在的复用。

2.搭建spring的观察者模式

1.搭建事件发布通用类

/**
 * 事件发布
 */
@Component
public class EventPublish {
    @Resource
    private ApplicationContext applicationContext;

    public void publish(Event event){
        applicationContext.publishEvent(event);
    }
}

2.搭建事件处理者(异步,同步时去掉@Async即可)

import com.wangfan.pojo.Event;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

@Component
public class EventConsumer {

    @EventListener(Event.class)
    @Async
    public void consumer(Event event){
        try {
            TimeUnit.SECONDS.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(event.getId());
        System.out.println(event.getContent());
        System.out.println("消息已被处理!");
    }
}

3.测试

import com.wangfan.event.EventPublish;
import com.wangfan.pojo.Event;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;
import java.util.Scanner;

@SpringBootTest
class TestWatchApplicationTests {

    @Resource
    private EventPublish eventPublish;
    @Test
    void contextLoads() {
        Event event = new Event();
        event.setId("1");
        event.setContent("前端业务已处理,传递参数:param");
        eventPublish.publish(event);
        System.out.println("前端方法执行完毕!");
        Scanner scanner=new Scanner(System.in);
        int i = scanner.nextInt();
        System.out.println(i);
    }

}

标签:订阅,调度,模式,观察者,import,设计模式,event
From: https://www.cnblogs.com/WangJingjun/p/17135776.html

相关文章

  • Azure 在 windows 11 下的 终端模式是如何操作?
    使用AzureCLI登录Azure命令行接口(CLI)又几种身份验证类型,那么如何登录?最简单的入门方法是使用 AzureCloudShell,这样可以自动登录。在本地,可以通过浏览器使......
  • 【JavaScript】17_debug,立即执行函数 与 严格模式
    14、debug<script>//debugger//在代码中打了一个断点console.log(a)//2vara=1console.log(a)//1fu......
  • 设计模式入门
    1、简介  设计模式(Designpattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这......
  • 对mvc模式的理解
    Model-View-ControllerMVC模式是个威力强大的复合模式,是由数个设计模式结合起来的模式;我们先看一下一个mp3播放器的设计,来由浅至深地了解这个设计模式的精髓所在: 从最......
  • ZMQ请求应答模式之无中间件的可靠性--自由者模式
    一、引言  我们讲了那么多关于中间件的示例,好像有些违背“ZMQ是无中间件”的说法。但要知道在现实生活中,中间件一直是让人又爱又恨的东西。实践中的很多消息架构能都在使......
  • 设计模式-简单工厂
    api.h#pragmaonce#include<string>#include<iostream>classAPI{public: virtualvoidrun(std::string)=0;protected: API(){};};classBAPI:publ......
  • 设计模式-原型模式
    原型模式(PrototypePattern):使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式是一种对象创建型模式应用实例描述如下:未使用原型模式#inc......
  • 设计模式-建造者模式
    业务场景未使用建造者模式实现#include<iostream>#include<string>#include<vector>#include<sstream>usingnamespacestd;template<classT>stringConvertTo......
  • 简单工厂模式
     packagecom.mhm.simplefactory;/****@authorAdministrator*@描述抽象产品角色*/publicinterfaceCar{publicvoiddrive();}packagecom.mhm.simplefactory......
  • 软件测试|测试开发之路--UI 自动化常用设计模式
    接上一次的帖子,今天讲一下我再UI自动化中常用的设计模式。由于网上已经有非常多的文章详细讲解了设计模式的编码实现,所以我今天也就不讲实现细节了。就是讲我也讲不出什......