首页 > 其他分享 >来自通义千问的观察者模式的实现

来自通义千问的观察者模式的实现

时间:2024-03-18 11:13:39浏览次数:36  
标签:String 通义 void 观察者 instanceId operationType 日志 public 千问

Spring相关的实现

BusinessProcessEvent.java

package com.example.demo.event;

import org.springframework.context.ApplicationEvent;

public class BusinessProcessEvent extends ApplicationEvent {
    private String instanceId;
    private String operationType;

    public BusinessProcessEvent(Object source, String instanceId, String operationType) {
        super(source);
        this.instanceId = instanceId;
        this.operationType = operationType;
    }

    public String getInstanceId() {
        return instanceId;
    }

    public String getOperationType() {
        return operationType;
    }
}

BusinessProcessEventLogger.java

package com.example.demo.listener;

import org.springframework.context.ApplicationListener;

public class BusinessProcessEventLogger implements ApplicationListener<BusinessProcessEvent> {

    @Override
    public void onApplicationEvent(BusinessProcessEvent event) {
        String instanceId = event.getInstanceId();
        String operationType = event.getOperationType();

        // 记录日志
        System.out.println("记录日志: Instance ID " + instanceId + "进行了" + operationType + "操作");

        // 在此处添加实际的日志记录逻辑,如将日志写入数据库或文件
    }
}

BusinessOperationService.java

package com.example.demo.service;

import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;

public class BusinessOperationService implements ApplicationEventPublisherAware {

    private ApplicationEventPublisher publisher;

    @Override
    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
        this.publisher = applicationEventPublisher;
    }

    public void executeBusinessOperation(String instanceId, String operationType) {
        // 执行业务操作...

        // 发布业务事件
        publisher.publishEvent(new BusinessProcessEvent(this, instanceId, operationType));
    }
}

AppConfig.java

package com.example.demo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {

    @Bean
    public BusinessProcessEventLogger businessProcessEventLogger() {
        return new BusinessProcessEventLogger();
    }

    @Bean
    public BusinessOperationService businessOperationService() {
        return new BusinessOperationService();
    }
}

DemoApplication.java

package com.example.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import com.example.demo.service.BusinessOperationService;

@SpringBootApplication
public class DemoApplication {

    @Autowired
    private BusinessOperationService businessOperationService;

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @PostConstruct
    public void runAfterStartup() {
        businessOperationService.executeBusinessOperation("exampleInstanceId", "新增操作");
        businessOperationService.executeBusinessOperation("anotherInstanceId", "删除操作");
    }
}

在上述代码中,DemoApplication 启动类会在Spring Boot应用启动后自动执行 runAfterStartup 方法,进而触发业务操作和日志记录。BusinessProcessEventLogger 作为监听器已经在Spring容器中注册并通过 @Bean 注解声明,因此在业务事件发生时会自动执行其 onApplicationEvent 方法。

在这段代码示例中,每个类扮演不同的角色,服务于整个事件驱动的业务日志记录流程。下面是每个类的实际作用:

BusinessProcessEvent.java

这个类代表了一个自定义的应用程序事件,继承自ApplicationEvent。每当业务操作(如新增或删除)完成时,都会发布一个此类实例。它包含了事件相关的数据成员,如instanceId和operationType,以便在事件处理时提供必要的信息。
BusinessProcessEventLogger.java

这个类实现了ApplicationListener接口,表明它是一个监听BusinessProcessEvent类型的事件的监听器。当一个BusinessProcessEvent事件被发布时,onApplicationEvent方法会被调用,此时就可以根据事件携带的信息记录业务日志。
BusinessOperationService.java

此类模拟了业务操作的执行者,它实现了ApplicationEventPublisherAware接口,意味着它可以注入ApplicationEventPublisher对象。在实际的业务方法executeBusinessOperation中,执行完操作后,它会发布一个BusinessProcessEvent事件,通知所有订阅了此事件的监听器(如BusinessProcessEventLogger)。
AppConfig.java

这是一个Spring配置类,通过@Configuration注解表明这是一个Spring容器的配置源。在这个配置类中,我们定义了两个@Bean方法,分别用来创建并注册BusinessProcessEventLogger和BusinessOperationService到Spring IoC容器中。这样,Spring框架就能管理这两个类的生命周期,并确保它们之间的依赖关系得到满足。
DemoApplication.java

这是Spring Boot应用的入口点,通过@SpringBootApplication注解启用自动配置和组件扫描。在main方法中启动Spring Boot应用,并在runAfterStartup方法上使用@PostConstruct注解,确保在应用初始化完成后自动执行一些初始操作。在这里,我们在应用启动后立即执行两次businessOperationService的executeBusinessOperation方法,触发业务操作和相应的日志记录。由于BusinessOperationService已经通过AppConfig配置类中的@Bean方法注入到了Spring容器,所以这里的@Autowired注解可以成功注入该服务实例。

Java方式的实现

以下是一个基于Java的简单观察者模式实现,用于记录业务日志。首先,我们定义两个接口:Subject(主题)和Observer(观察者),然后创建具体实现类并应用到您的业务场景中。

import java.util.ArrayList;
import java.util.List;

// 定义Subject接口
interface Subject {
    void registerObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObservers(String instanceId, String operationType);
}

// 定义Observer接口
interface Observer {
    void update(String instanceId, String operationType);
}

// 业务逻辑类,充当Subject角色
class BusinessOperation implements Subject {
    private List<Observer> observers = new ArrayList<>();
    private String instanceId;
    private String operationType;

    @Override
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }

    @Override
    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }

    // 执行业务方法,并在完成后通知所有观察者
    public void executeBusinessOperation(String instanceId, String operationType) {
        this.instanceId = instanceId;
        this.operationType = operationType;
        
        // 假设这里执行了具体的新增或删除操作...
        // ...
        
        // 操作成功,通知观察者
        notifyObservers(instanceId, operationType);
    }

    @Override
    public void notifyObservers(String instanceId, String operationType) {
        for (Observer observer : observers) {
            observer.update(instanceId, operationType);
        }
    }
}

// 日志记录类,充当Observer角色
class BusinessLogObserver implements Observer {
    @Override
    public void update(String instanceId, String operationType) {
        System.out.println("记录日志: Instance ID " + instanceId + "进行了" + operationType + "操作");
        // 在这里实际实现日志记录功能,例如将日志写入文件或数据库
    }
}

// 使用示例
public class Main {
    public static void main(String[] args) {
        BusinessOperation businessOperation = new BusinessOperation();
        BusinessLogObserver logObserver = new BusinessLogObserver();

        // 注册观察者
        businessOperation.registerObserver(logObserver);

        // 执行业务操作并触发日志记录
        businessOperation.executeBusinessOperation("exampleInstanceId", "新增操作");
        businessOperation.executeBusinessOperation("anotherInstanceId", "删除操作");
    }
}

在这个例子中,BusinessOperation 类是业务方法的具体实现,它在执行完新增或删除操作后通过调用 notifyObservers 方法通知观察者。BusinessLogObserver 类负责接收通知并记录日志。当有新的业务操作执行时,系统会自动记录相应的业务日志。

标签:String,通义,void,观察者,instanceId,operationType,日志,public,千问
From: https://www.cnblogs.com/xxsdnol/p/18079918

相关文章

  • LLM-通义千问:PCS变流器
    PCS变流器(PowerConversionSystem)是一种电力电子设备,主要用于储能系统中,实现电能的双向转换。在电池储能系统中,PCS连接于电池组与交流电网之间,扮演着关键的桥梁角色:功能:双向能量流动:PCS能够将来自电网的交流电(AC)整流为直流电(DC),给电池储能系统充电;反之,它也能将电池储存的直流......
  • 试用AI做方案设计,通义灵码——一个博学但“健忘”的智能编码辅助工具
    最近,人工智能编程领域的创新成果层出不穷,让我这个程序员跃跃欲试。今天,我终于决定亲自体验一下阿里云研发的智能编码助手——通义灵码,在我的VisualStudioCode编辑器中成功安装了这款插件,并顺利开启了它的功能。当我打开插件对话框并输入相关的设计需求或代码问题时,只需一......
  • 分享通义ChatGPT实用技能123
    前言作为一名程序员,你一定有过这样的经历:排查某个bug花费了好几个小时,在各个搜索引擎尝试搜索,浏览了几十甚至上百个网站,结果搜到的答案千篇一律,没有一个说到点上。而自从有了ChatGPT,就可以告别这种窘境,不需要到各个网站搜索答案,也不用在各种技术交流群里“低三下四”地求人......
  • 国产Ai代码助手,通义灵码IDEA安装教程
    访问链接注册《通义灵码》账号https://developer.aliyun.com/topic/lingma/activities/202403?taskCode=14508&recordId=7b0c66673d3e0e56e7e970d788cfc465#/?utm_content=m_fission_1 步骤1点击File-->Settings步骤2点击Plugins-->Marketplace步骤3搜索通义灵码(TONG......
  • 【免费薅羊毛】该冲还是得冲,通义灵码做活动
    通义灵码是阿里旗下的代码补全工具,目前正在做活动。https://developer.aliyun.com/topic/lingma/activities/202403?taskCode=14508&recordId=a559ee76fb387118328a69b0cc4cd090#/?utm_content=m_fission_1「通义灵码·体验AI编码,开AI盲盒」具体的奖品有:T-shift日......
  • 通义灵码生成结构体存取代码
    输入文本读取和写入struct结构体生成代码#include<stdio.h>//定义结构体structPerson{charname[20];intage;};intmain(){//创建结构体变量structPersonperson={"Alice",20};//打开文件FILE*file=fopen("person.t......
  • 18_观察者模式
    观察者模式是一种行为型设计模式,它定义了对象之间的一对多依赖关系,使得当一个对象的状态发生改变时,其相关依赖对象会自动收到通知并更新。观察者模式有四个主要角色:主题(Subject):定义了观察者的注册、删除和通知方法。主题可以是具体类或接口。具体主题(ConcreteSubject):继承......
  • 阿里通义千问大模型初探
    参考文档:https://help.aliyun.com/zh/dashscope/developer-reference/quick-start一、创建API-KEY控制台地址:https://dashscope.console.aliyun.com/apiKey二、使用javaSDK接入全量输出:根据用户的prompt,一次性将结果输出给用户增量输出:根据用户的prompt,一个字一个字的输出......
  • 观察者模式
     观察者:publicinterfaceObserver{voidupdate(floattemperature,floathumidity,floatpressure);}主体;publicinterfaceSubject{publicvoidregisterObserver(Observerobserver);publicvoidremoveObserver(Observerobserver);......
  • 千问72-chat私有化部署
    千问开源的版本挺多,版本有1和1.5,参数有1.8~72B,模态有语言、语音、视觉。72B就有Qwen-72b-chat(聊天)和Qwen-72b(基础/预训练)两个版本,以下为简单的Qwen-72b-chat的坑:1、下载模型(魔塔社区),权重文件140+G2、新建虚拟环境,基础要求:python>3.8、pytorch>1.12、cuda>11.4;依赖:"transforme......