Golang设计模式之-选项模式

在Go语言(Golang)中,选项模式(Option Pattern)是一种常用于构造复杂对象时提供灵活性的设计模式。这种模式允许用户在创建对象时设置一个或多个可选参数,而不需要定义多个构造函数或者创建大量的配置结构体,但在golang中由于不能设置默认参数所有我们就需要通过一些多构造函数来实现

多构造函数实现

package main

import "fmt"

const (
	defaultHost = "127.0.0.1"
	defaultPort = 8080
)

type Server struct {
	Host string
	Port int
}

func NewServer() *Server {
	return &Server{
		Host: defaultHost,
		Port: defaultPort,
	}
}

func NewServerWithOptions(host string, port int) *Server {
	return &Server{
		Host: host,
		Port: port,
	}
}

func main() {
	s1 := NewServer()
	s2 := NewServerWithOptions("192.168.0.1", 8899)
	fmt.Println(s1)
	fmt.Println(s2)
}

返回值

&{127.0.0.1 8080}
&{192.168.0.1 8899}

这里我们通过2个构造函数NewServerNewServerWithOptions 来实现的

观察模式实现

package main

import "fmt"

const (
	defaultHost = "120.0.0.1"
	defaultPort = 8080
)

type Server struct {
	Host string
	Port int
}

type Option func(server *Server)

func WithHost(host string) Option {
	return func(s *Server) {
		s.Host = host
	}
}

func WithPort(port int) Option {
	return func(s *Server) {
		s.Port = port
	}
}

func newServer(options ...Option) *Server {
	s := &Server{
		Host: defaultHost,
		Port: defaultPort,
	}
	for _, opt := range options {
		opt(s)
	}
	return s
}

func main() {
	s := newServer()
	fmt.Println(s)
	s1 := newServer(WithHost("192.168.0.1"), WithPort(9988))
	fmt.Println(s1)

}

结果

&{120.0.0.1 8080}
&{192.168.0.1 9988}

这里定义了一个Server结构体,它有2个字段:HostPort。还定义了一个Option类型,它是一个接受*Server参数的函数类型。然后,定义了几个返回Option类型的函数,这些函数可以修改Server的不同字段。
最后,有一个NewServer函数,它接受一个Option类型的可变参数列表,并用它们来配置新创建的Server实例。这样,就可以在创建Server时灵活地设置它的不同选项,而不需要为每一种可能的配置组合创建不同的构造函数