当前位置: 首页 > news >正文

Java/Golang:活用interface,增加程序扩展性

场景

在paas中间件众多的场景下,做一款用于巡检多个paas组件健康状态的工具。工具的编写需要具备一定的扩展性,便于后续新增某个paas组件巡检的功能。

管理多个paas组件,需要方便扩展新增。

思路

使用面向对象编程思想,首先对巡检任务CronJob进行抽象(interface),抽象出JobManager框架程序,在对paas组件巡检功能编程中,仅需要实现特定的paas组件的CronJob,增加到Job列表中统一处理。

实现

假定paas组件有两个:abase、redis

  • 首先定义、抽象CronJob和JobManager
package jobimport ("fmt"
)//用于定义任务需要实现的方法
type CronJob interface {Run()JobName() string
}//任务管理器
type JobManager struct {Jobs []CronJob
}func NewJobManager() *JobManager {return &JobManager{}
}//注册job
func (jm *JobManager) RegisterJob(job CronJob) {jm.Jobs = append(jm.Jobs, job)
}//job执行
func (jm *JobManager) Start() {for _, job := range jm.Jobs {fmt.Println("job name:", job.JobName())job.Run()}
}
  • paas组件实现

abase.go

package jobimport ("fmt"
)type AbaseJob struct{}func (a *AbaseJob) Run() {fmt.Println("abase job running!!!")
}func (a *AbaseJob) JobName() string {return "abase job"
}

redis.go

package jobimport ("fmt"
)type RedisJob struct{}func (a *RedisJob) Run() {fmt.Println("redis job running!!!")
}func (a *RedisJob) JobName() string {return "redis job"
}
  • 整体调用
package mainimport ("demo_jobmanager/job"
)func main() {//实例化jm := job.NewJobManager()//注册jobjm.RegisterJob(&job.AbaseJob{})jm.RegisterJob(&job.RedisJob{})//执行jm.Start()
}

相关文章:

  • 堆和栈的空间利用率
  • 2024下《系统集成项目管理工程师》50个高频考点汇总!值得收藏
  • 怎么建设高性能多核DSP+FPGA实验室?一起来河北工程大学看看
  • HTML中Canvas关键知识点总结
  • 一场决定未来的战役,又是梦想起航的地方
  • 【玄机-应急平台】第六章 流量特征分析-蚂蚁爱上树
  • kubernetes负载均衡---MetalLB
  • STM32项目分享:智能家居语音系统
  • python基于flask写后端接口、python接收请求、python作为服务端提供接口、python接收json数据或数组
  • JVM学习-JVM运行时参数
  • 24.6.2(动态开点线段树)
  • 股票数据集1-纳斯达克NASDAQ 100简介
  • 【java11】java11新特性之嵌套类
  • 打造无障碍网络体验:Edge 浏览器代理服务器设置指南
  • 【Unity实战篇 】 | Unity实现UGUI颜色渐变,支持透明渐变
  • 2017-08-04 前端日报
  • Android 控件背景颜色处理
  • Docker: 容器互访的三种方式
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • ES6之路之模块详解
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • Java-详解HashMap
  • jquery ajax学习笔记
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • Linux后台研发超实用命令总结
  • Zsh 开发指南(第十四篇 文件读写)
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 容器服务kubernetes弹性伸缩高级用法
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 微信支付JSAPI,实测!终极方案
  • 物联网链路协议
  • 自制字幕遮挡器
  • ​Java并发新构件之Exchanger
  • !!java web学习笔记(一到五)
  • "无招胜有招"nbsp;史上最全的互…
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (函数)颠倒字符串顺序(C语言)
  • (四)c52学习之旅-流水LED灯
  • (图)IntelliTrace Tools 跟踪云端程序
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .net 简单实现MD5
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • [ element-ui:table ] 设置table中某些行数据禁止被选中,通过selectable 定义方法解决
  • [ vulhub漏洞复现篇 ] Celery <4.0 Redis未授权访问+Pickle反序列化利用
  • [2023-年度总结]凡是过往,皆为序章
  • [Android View] 可绘制形状 (Shape Xml)
  • [BPU部署教程] 教你搞定YOLOV5部署 (版本: 6.2)
  • [BZOJ] 1001: [BeiJing2006]狼抓兔子
  • [C/C++]数据结构 堆的详解
  • [C++]AVL树怎么转