首页 > 其他分享 >插件工厂和AOP拦截器机制

插件工厂和AOP拦截器机制

时间:2024-11-12 10:41:43浏览次数:1  
标签:插件 拦截器 DoSomething Service func AOP string

一. 插件工厂

基于接口机制的插件工厂是一种设计模式,用于创建和管理插件。插件是独立的模块,可以动态加载和卸载,以扩展应用程序的功能。
通过使用接口,插件工厂可以提供一种统一的方式来创建和管理这些插件,而不需要了解插件的具体实现细节。
具体实现来说,实现一个插件工厂通过哈希记录所有名字和插件的映射,实现一个插件接口,进一步对于插件工厂可以实现注册函数给工厂注册插件,通过工厂获取创建插件。

package main

import (
    "fmt"
)

// Plugin 是所有插件必须实现的接口
type Plugin interface {
    DoSomething() string
}

// PluginFactory 是一个插件工厂,用于创建插件
type PluginFactory struct {
    plugins map[string]func() Plugin
}

// RegisterPlugin 注册一个插件
func (f *PluginFactory) RegisterPlugin(name string, factory func() Plugin) {
    if f.plugins == nil {
        f.plugins = make(map[string]func() Plugin)
    }
    f.plugins[name] = factory
}

// CreatePlugin 创建一个插件
func (f *PluginFactory) CreatePlugin(name string) (Plugin, error) {
    if factory, ok := f.plugins[name]; ok {
        return factory(), nil
    }
    return nil, fmt.Errorf("plugin not found: %s", name)
}

// ExamplePlugin 是一个示例插件
type ExamplePlugin struct{}

func (p *ExamplePlugin) DoSomething() string {
    return "ExamplePlugin doing something"
}

func main() {
    factory := &PluginFactory{}

    // 注册插件
    factory.RegisterPlugin("example", func() Plugin {
        return &ExamplePlugin{}
    })

    // 创建并使用插件
    plugin, err := factory.CreatePlugin("example")
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
    fmt.Println(plugin.DoSomething())
}

二. 拦截器

AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,旨在通过分离横切关注点(如日志记录、事务管理、权限控制等)来提高代码的模块化。
拦截器是 AOP 的一种实现方式,用于在方法调用的前后执行额外的逻辑
具体实现来说,以日志拦截器为例,日志拦截器可以对服务进行拦截,同时返回一个封装了对应服务的日志实例,这样可以通过该实例执行服务前日志,再执行服务,接着执行服务后日志。
就结果而言,跟微服务中间件的链式执行类似,。

package main

import (
    "fmt"
)

// Service 是一个示例服务接口
type Service interface {
    DoSomething() string
}

// RealService 是 Service 的具体实现
type RealService struct{}

func (s *RealService) DoSomething() string {
    return "RealService doing something"
}

// Interceptor 是一个拦截器接口
type Interceptor interface {
    Intercept(Service) Service
}

// LoggingInterceptor 是一个日志拦截器
type LoggingInterceptor struct{}

func (i *LoggingInterceptor) Intercept(service Service) Service {
    return &loggingService{service}
}

type loggingService struct {
    Service
}

func (s *loggingService) DoSomething() string {
    fmt.Println("Before DoSomething")
    result := s.Service.DoSomething()
    fmt.Println("After DoSomething")
    return result
}

func main() {
    service := &RealService{}
    interceptor := &LoggingInterceptor{}

    // 使用拦截器包装服务
    wrappedService := interceptor.Intercept(service)

    // 调用方法
    fmt.Println(wrappedService.DoSomething())
}

标签:插件,拦截器,DoSomething,Service,func,AOP,string
From: https://www.cnblogs.com/929code/p/18541353

相关文章

  • 【Playwright + Python】系列(九)Playwright 调用 Chrome 插件,小白也能事半功倍
    哈喽,大家好,我是六哥!今天我来给大家分享一下如何使用playwight调用chrome插件,面向对象为功能测试及零基础小白,我尽量用大白话的方式举例讲解,力求所有人都能看懂,建议大家先收藏,以免后面找不到。......
  • 【教程】第四章:任务与评论插件 —— 如虎添翼,顺利掌握
    回顾上一节小伙伴们还记得上一节的挑战任务吗?我们要为任务表配置状态和附件字段,并在任务列表里展示它们。别急,咱们先揭晓答案!状态字段的配置:选择下拉菜单(单选)字段,填写选项标签:未开始、进行中、待审核、已完成、已取消、已归档。颜色根据你的喜好自由设置,给任务增添一点......
  • OMV安装文件管理器filebrowser和照片管理photoprism插件时Pull不了镜像的解决办法
    OMV安装文件管理器filebrowser和照片管理photoprism插件安装后不能启动服务或者PULL不了镜像卡着不动都是因为现在国内pull不了镜像的原因这里有个迷惑的人的地方是很多朋友认为是用docker来pull的镜像,于是增加了docker国内加速源后发现OMV还是拉取不了镜像。解决方法如下:因为OM......
  • 因为mysql 8新的认证插件导致主从复制的IO线程失败
    1、错误信息Last_IO_Error:errorconnectingtomaster'[email protected]:3306'-retry-time:60retries:1message:Authenticationplugin'caching_sha2_password'reportederror:Authenticationrequiressecureconnection.2、在主库检查复制用户的pl......
  • 国标GB28181软件LiteGBS国标GB28181网页直播平台,介绍LiteGBS视频安防汇聚平台实现多设
    随着信息化的高速发展,网络已成为人们生活中不可或缺的一部分。视频监控系统也迎来了网络化、智能化的新时代,其发展速度之快,已渗透到人们生活的各个角落。传统的视频监控系统因缺乏智能元素,已无法满足客户对低成本、高扩展性、强兼容性和高性能远程实时视频服务平台的需求。客户期......
  • 亚马逊自动调价功能的使用方法(附插件安装教程)
     月亮树跨境-自动调价插件下载地址和安装教程:MoonTree自动定时AI抢车调价插件:安装、下载操作说明-月亮树跨境今天,我想向大家介绍一款亚马逊自动调价工具。这款工具最多支持1万件商品调价、定时启用调价的功能,帮助做亚马逊跨境电商的小伙伴们精准抢购黄金购物车!第一步、设置......
  • 反射API与AOP在日志记录与审计中的应用案例
    引言在现代软件开发中,日志记录和审计是两个非常重要的功能,它们帮助开发者监控系统行为、追踪错误和安全问题。反射API和面向切面编程(AOP)是实现这些功能的强大工具。本文将探讨如何结合这两种技术来提高日志记录和审计的灵活性和效率。反射API在日志记录中的应用反射API允许......
  • Kafka 之自定义消息拦截器【Kafka 拦截器】
    前言:拦截器这个概念相信大部分朋友都不会陌生,SpringMVC拦截器相信大家都用过,拦截器的核心思想就是运行应用程序在不修改业务逻辑的前提下,动态的实现一组可插拔的事件处理器链,它可以在业务链路中的前后各个点进行对应的拦截,做一些统一的处理,SpingMVC的拦截器大家都了解,......
  • AnimateDiff:一款强大的制作丝滑动画视频插件,轻松让你的图片动起来
    得益于StableDiffusion的开源,目前很多开发者推出了基于SD生成动画和视频的应用技术和扩展插件,在众多的技术中,AnimateDiff插件以“效果丝滑、稳定、无闪烁”等特性,成为目前Stablediffusion中效果最好的生成动画视频插件之一。今天就给大家详细介绍一下在Stablediffusion中......
  • VSCode 提示或者强制用户安装某些插件?
    前言插件的使用使得VSCode能够满足从前端开发、后端开发到数据科学等多种需求。在团队协同开发中,确保每个开发者都安装了必要的插件,可以极大地提高开发效率和代码一致性。本指南将详细介绍如何在VSCode中提示用户安装特定插件,并确保这些插件得到正确配置。为什么需要插件?......