Golang Option选项模式

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)
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值