Golang 选项模式(Option模式)

女爷i 2022-09-13 05:26 351阅读 0赞

Golang 选项模式(Option模式)

Option模式的专业术语为:Functional Options Pattern(函数式选项模式)
Option模式为golang的开发者提供了将一个函数的参数设置为可选的功能,也就是说我们可以选择参数中的某几个,并且可以按任意顺序传入参数。
比如针对特殊场景需要不同参数的情况,C++可以直接用重载来写出任意个同名函数,在任意场景调用的时候使用同一个函数名即可;但同样情况下,在golang中我们就必须在不同的场景使用不同的函数,并且参数传递方式可能不同的人写出来是不同的样子,这将导致代码可读性差,维护性差。

Option模式的优缺点

优点

  1. 支持传递多个参数,并且在参数个数、类型发生变化时保持兼容性
  2. 任意顺序传递参数
  3. 支持默认值
  4. 方便拓展

缺点

  1. 增加许多function,成本增大
  2. 参数不太复杂时,尽量少用

Option模式demo

  1. package main
  2. import "fmt"
  3. type Message struct {
  4. id int
  5. name string
  6. address string
  7. phone int
  8. }
  9. func (msg Message) String() {
  10. fmt.Printf("ID:%d \n- Name:%s \n- Address:%s \n- phone:%d\n", msg.id, msg.name, msg.address, msg.phone)
  11. }
  12. func New(id, phone int, name, addr string) Message {
  13. return Message{
  14. id: id,
  15. name: name,
  16. address: addr,
  17. phone: phone,
  18. }
  19. }
  20. type Option func(msg *Message)
  21. var DEFAULT_MESSAGE = Message{id: -1, name: "-1", address: "-1", phone: -1}
  22. func WithID(id int) Option {
  23. return func(m *Message) {
  24. m.id = id
  25. }
  26. }
  27. func WithName(name string) Option {
  28. return func(m *Message) {
  29. m.name = name
  30. }
  31. }
  32. func WithAddress(addr string) Option {
  33. return func(m *Message) {
  34. m.address = addr
  35. }
  36. }
  37. func WithPhone(phone int) Option {
  38. return func(m *Message) {
  39. m.phone = phone
  40. }
  41. }
  42. func NewByOption(opts ...Option) Message {
  43. msg := DEFAULT_MESSAGE
  44. for _, o := range opts {
  45. o(&msg)
  46. }
  47. return msg
  48. }
  49. func NewByOptionWithoutID(id int, opts ...Option) Message {
  50. msg := DEFAULT_MESSAGE
  51. msg.id = id
  52. for _, o := range opts {
  53. o(&msg)
  54. }
  55. return msg
  56. }
  57. func main() {
  58. message1 := New(1, 123, "message1", "cache1")
  59. message1.String()
  60. message2 := NewByOption(WithID(2), WithName("message2"), WithAddress("cache2"), WithPhone(456))
  61. message2.String()
  62. message3 := NewByOptionWithoutID(3, WithAddress("cache3"), WithPhone(789), WithName("message3"))
  63. message3.String()
  64. }

发表评论

表情:
评论列表 (有 0 条评论,351人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Go选项模式

    > Functional Options Pattern,选项模式 1、什么是选项模式 选项模式是一种在 Go 语言中很常用的设计模式,特别是当你有一个结构体或函数,并

    相关 Go 函数选项模式

    Golang 开发者遇到的许多问题之一是尝试将一个函数的参数设置为可选. 这是一个非常常见的用例, 有些对象应该使用一些基本的默认设置来开箱即用, 并且你偶尔可能需要提供一些更

    相关 golang设计模式(3)组合模式

    组合模式,使我们在树形结构问题中,使用者可以忽略简单元素和复杂元素的概念。客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素内部结构解耦。当应用场景出现分

    相关 golang设计模式(2)工厂模式

    工厂模式根据条件产生不同功能类,工厂模式在解耦方面将使用者和产品之间的依赖推给了工厂,让工厂承担这种依赖关系。工厂模式分简单工厂模式、方法工厂模式和抽象工厂模式。Golang实