package main
import "fmt"
// 方式一:函数选项
// 应用场景:适用于需要配置一组相关的参数的情况。
// 数据库连接配置
// 当连接数据库时,可以使用函数选项来设置连接参数,如主机、端口、用户名、密码等。
// HTTP请求配置
// 在发起HTTP请求时,可以使用函数选项来设置请求头、超时时间、代理等信息。
// 构建对象
// 在构造对象时,可以使用函数选项来设置对象的属性,如日志级别、缓存配置等。
type Option func(*Config)
type Config struct {
Addr string
Port int
Timeout int
Auth string
}
func NewConfig(addr string, port int, opts ...Option) *Config {
conf := &Config{
Addr: addr,
Port: port,
}
for _, opt := range opts {
opt(conf)
}
return conf
}
func WithTimeout(timeout int) Option {
return func(conf *Config) {
conf.Timeout = timeout
}
}
func WithAuth(auth string) Option {
return func(conf *Config) {
conf.Auth = auth
}
}
// 方式二:可选接口
// 应用场景:适用于需要定义多态行为的情况。
// 插件系统,如果需要实现一个插件系统,不同的插件可以实现不同的接口来定制其行为。
// 事件处理器,对于一个事件处理器,可以根据不同的事件类型实现不同的接口来处理不同的事件。
// 数据存储,在实现不同的数据存储引擎时,可以为每种引擎实现不同的接口来处理读写操作。
func NewConfig2(addr string, port int, opts ...Optioner) *Config {
conf := &Config{
Addr: addr,
Port: port,
}
for _, opt := range opts {
opt.Apply(conf)
}
return conf
}
type Optioner interface {
Apply(*Config)
}
type TimeoutOption struct {
Value int
}
func (o TimeoutOption) Apply(conf *Config) {
conf.Timeout = o.Value
}
type AuthOption struct {
Value string
}
func (o AuthOption) Apply(conf *Config) {
conf.Auth = o.Value
}
func main() {
conf := NewConfig("localhost", 6379)
fmt.Println("Default:", *conf)
conf2 := NewConfig(
"localhost", 6379,
WithTimeout(500),
WithAuth("password"),
)
fmt.Println("With options:", *conf2)
conf3 := NewConfig2(
"localhost", 6379,
TimeoutOption{Value: 500},
AuthOption{Value: "password"},
)
fmt.Println("With Optioner:", *conf3)
}
Golang Option选项模式
最新推荐文章于 2024-08-30 08:36:25 发布