golang设计模式-建造者模式

Jasonzz · · 4075 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

当一个方法有多个变量的时候,我们在调用该方法的时候可能会因为参数的顺序、个数错误,而造成调用错误或者不能达到我们预期的目的。针对这个问题,我们的建造设计模式可以完美的解决这个问题 刚接触设计模式,请大家留下宝贵的意见,谢谢。 实现代码 builder.Go ```javascript package Desktop import ( "bytes" ) // builder设计模式,主要解决多变参数传递问题 // xorm就是使用了builder设计模式 // 故事: 平时去面馆吃面,有各种味道的面条(牛肉味、肥肠味等) // 有各种配料(香菜、葱、姜、辣椒等) // 第一个客人:一碗牛肉面 加葱、姜 // 第二个客人:一碗牛肉面 加葱、香菜 type MyBuilder struct { NoodlesType string // 面条口味 Coriander bool // 是否加香菜 Onion bool // 是否加葱 Ginger bool // 是否加姜 Pepper bool // 是否加辣椒 } // 构造一个结构体 func NewMyBuilder(noodsType string) MyBuilder { return MyBuilder{NoodlesType: noodsType} } // 加香菜 func (myBuilder MyBuilder) withCoriander() MyBuilder { myBuilder.Coriander = true return myBuilder } // 加葱 func (myBuilder MyBuilder) withOnion() MyBuilder { myBuilder.Onion = true return myBuilder } // 加姜 func (myBuilder MyBuilder) withGinger() MyBuilder { myBuilder.Ginger = true return myBuilder } // 加辣椒 func (myBuilder MyBuilder) withPepper() MyBuilder { myBuilder.Pepper = true return myBuilder } func (myBuilder MyBuilder) String() string { var buffer bytes.Buffer buffer.WriteString("要一碗" + myBuilder.NoodlesType + "面,") if myBuilder.Coriander { buffer.WriteString("加香菜、") } else { buffer.WriteString("不加香菜、") } if myBuilder.Onion { buffer.WriteString("加葱、") } else { buffer.WriteString("不加葱、") } if myBuilder.Ginger { buffer.WriteString("加姜、") } else { buffer.WriteString("不加姜、") } if myBuilder.Pepper { buffer.WriteString("加辣椒、") } else { buffer.WriteString("不加辣椒、") } buffer.WriteString("\n") return buffer.String() } ``` 测试代码 builder_test.go ```javascript package Desktop import ( "fmt" "testing" ) func Test_MyBuilder(t *testing.T) { myBuilder := NewMyBuilder("牛肉"). withCoriander(). withGinger() str := myBuilder.String() fmt.Println(str) } ``` 测试结果: ```javascript 要一碗牛肉面,加香菜、不加葱、加姜、不加辣椒、 PASS ok _/Users/jason/Desktop 0.008s ```

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

4075 次点击  ∙  2 赞  
加入收藏 微博
4 回复  |  直到 2018-08-10 11:46:19
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传