Design Pattern to write a software development layer in go [关闭]

uelo1irk  于 2023-10-14  发布在  Go
关注(0)|答案(2)|浏览(97)

已关闭,此问题需要更focused。它目前不接受回答。
**想改善这个问题吗?**更新问题,使其只关注editing this post的一个问题。

9天前关闭
Improve this question
我正在尝试在Golang现有库的基础上创建一个API层或软件开发工具包(SDK)。我的目标是让它在Go中具有高度的灵活性和可扩展性,这样我们就可以在不改变现有代码库的情况下添加或扩展新功能。例如,如果我正在实现一个send_msg()函数,它应该能够根据作为参数指定的消息类型发送不同类型的消息。
例如,如果我正在实现一个通用的API来发送基于以下特定消息的消息

send_msg(msg_type M1, param1....paramN);
  send_msg(msg_type M2, param1....paramN);
  send_msg(msg_type M3, param1....paramN);`

要实现它,我可以简单地在go中编写一个函数,如下所示(伪代码)

func send_msg(mst_type int, param1 type1.....paramN typeN) 
{
    case: msg_type M1
          perform msg processing and sending based on M1;
    case: msg_type M2
          perform msg processing and sending based on M2;
    case: msg_type M3
          perform msg processing and sending based on M3;

    default:
          other type processing
}

但是上面的代码可能不是高度可扩展的。例如,如果我们希望引入新的msg_type及其相应的处理,我们需要修改现有的send_msg()函数。有没有更好的设计模式来支持可扩展插件,或者你有没有其他的设计模式或设计建议来解决这个问题?

bvhaajcl

bvhaajcl1#

如果send_msg的调用者使用常量作为第一个参数,那么为每个消息类型编写一个函数,并直接调用该函数。例如,transform:

const (
   M1 = iota
   M2
}
...
send_msg(M1, param)
send_msg(M2, param)

收件人:

send_msg_m1(param)
send_msg_m2(param)

当调用者使用变量指定消息类型时,上述转换没有用处。
另一种选择是使用Map,其中键是消息类型,值是处理该消息类型的函数。

const (
   M1 = iota
   M2
}
 var handlers = map[int]func(param){
    M1: send_msg_m1,
    M2: send_msg_m2,
}

func send_msg(messageType int, param) {
   h, ok := handlers[messageType]
   if !ok {
       h = default_handler
   }
   h(param)
}
fcipmucu

fcipmucu2#

你可以利用Go语言接口的强大功能,并使用像命令模式或策略模式这样的设计模式。这种方法允许您添加或扩展新功能,而无需更改现有的代码库。

相关问题