从 elastic 之中看到的,示例代码
package main import ( "log" ) func main() { var c = new(Elastic) var d = new(ElasticOption) c.say(d, SetHttpClient(), SetRequestMethod()) } type Elastic struct { } type ElasticOption struct { } func (c *Elastic) say(d *ElasticOption, opt ...ClientOptionFunc) { if len(opt) != 0 { for _, v := range opt { v(d) } } } type ClientOptionFunc func(*ElasticOption) error func SetHttpClient() ClientOptionFunc { return func(c *ElasticOption) error { log.Println("ClientOptionFunc SetHttpClient") return nil } } func SetRequestMethod() ClientOptionFunc { return func(c *ElasticOption) error { log.Println("ClientOptionFunc SetRequestMethod") return nil } }
正常人的脑回路是:
在创建对象的时候 - createClient 的时候,写一大堆配置代码
而每次有新配置变更的时候,都需要动 createClient 代码
而上面的方式,可以完全不用动 createClient ,比如新增配置可以更改SSL 只需要增加 SetRequestSSL
抽象
抽象化与实现化解耦?