golang中接口和多态的简单使用
原先系统中原先对接了企业微信和一些第三方数据源的组织架构,现在有对接了钉钉,每次对接不是同步进行的,每对接一个就会重新写一遍程序,代码的复用性不高。
最初的想法是用提供一个接口对不同的平台来实现不同的方式,把同步到系统中的逻辑代码提取成公共的方法。
最后又给这个接口提供了一个描述行为的一个方法,不同的平台创建不同的对象,不同的对象都可以调用这个行为(函数),从而调用不同的接口中方法的实现。
大体实现方式如下图:(根据自己的理解去画的,不知道对不对,仅供参考)
接口和描述行为方法:
type PlatformDataSourceInterface interface {
//同步组织架构的接口
SynOrgAndMember() *core.ErrMsg
}
//描述这个接口所做的事情
func DoPlatformDataSourceSynOrgAndMember(pds PlatformDataSourceInterface) *ErrInfo {
return pds.SynOrgAndMember()
}
不同的平台去实现这个接口中的方法:
type OrgSynDingDing struct {
Db *dbx.MyDb
TenantId string
Authorization string
}
//获取对象
func GetOrgSynDingDing(db *dbx.MyDb, tenantId, token string) *OrgSynDingDing {
return &OrgSynDingDing{
db,
tenantId,
token,
}
}
//实现接口中的方法
func (this *OrgSynDingDing) SynOrgAndMember() *ErrInfo {
dingClient := ding.NewMineClient(corpId, customKey, customSecret, this.Db)
//部门列表
depts := dingClient.GetDeptList()
for _, v := range depts {
SynDingOneOrgAndMember(this.Db, dingClient, this.TenantId, this.Authorization, v.Id, v.Parentid, v.Name)
}
return nil
}
当有不同的平台需要同步组织架构的时候,可以使用不同的对象调用相同的行为来实现不同平台的数据同步:
func Import(tp string) {
switch errMsg.Message {
case "dingding":
synDing := services.GetOrgSynDingDing(this.Db, this.TenantId,
this.Ctx.Request.Header.Get("Authorization"))
errInfo := services.DoPlatformDataSourceSynOrgAndMember(synDing)
if errInfo != nil {
return
}
case "wx_corp":
synWxcorp := services.GetOrgSynWxcorp(this.Db, this.TenantId,
auth)
errInfo := services.DoPlatformDataSourceSynOrgAndMember(synWxcorp )
if errInfo != nil {
return
}
case "other1":
....
default:
}
}
这样通过不同的平台去拿同步的数据,往系统里面同步数据时使用同一套系统同步数据逻辑,代码架构比较清晰,方便以后的维护工作,遇到不同的逻辑处理,只要修改每个实现的接口就可以。
接口和多态的简单实现解决了我们多平台同步数据的代码复用的问题,可能还会有很多种最佳方案,仅供参考。
到此这篇关于“golang中接口和多态的简单使用”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!您可能感兴趣的文章:
golang 接口的定义和实现
golang中接口和多态的简单使用
关于Golang的那些事(六) -- 接口
2020-10-18Go语言接口
Go语言的空接口,接口类型断言
浅谈golang中的接口
golang 动态生成函数_GoLang的优点和缺点
想系统学习GO语言(Golang
go struct 成员变量后面再加个字符串是什么意思?_Go语言的学习笔记(第十章) 接口...
golang基础教程