go语言设计模式之装饰模式(如此包装)

cleanerxiaoqiang 2019-02-27

本文主要说一下设计模式之装饰模式,后续会有更多的模式和算法以及区块链相关的,如果你是想学习go语言或者是对设计模式或者算法感兴趣亦或是区块链开发工作者,都可以关注一下。(vx公号,csdn:Go语言之美。更多go语言知识信息等)。

go语言设计模式之装饰模式(如此包装)

更多go语言相关代码github:

https://github.com/rayyyes

装饰模式:动态的给一个对象添加一些额外的职责。在编程语言中,我们经常使用继承来做到这一点,而装饰模式其实也是多继承的一种实现方式。

go语言设计模式之装饰模式(如此包装)

我们看一下go语言实现装饰模式:

package main
import "fmt"
type Person interface {
   show()
}
type Finery struct {
   Name string
   Person
}
func (this *Finery) Decorate(p Person) {
   this.Person = p
}
func (this *Finery) show() {
   fmt.Println(this.Name + "的装扮:")
}
type TShirts struct {
   Person
}
func (this *TShirts) show() {
   this.Person.show()
   fmt.Println("T恤")
}
func (this *TShirts) Decorate(p Person) {
   this.Person = p
}
type BigTrouser struct {
   Person
}
func (this *BigTrouser) Decorate(p Person) {
   this.Person = p
}
func (this *BigTrouser) show() {
   this.Person.show()
   fmt.Println("垮裤")
}
type WearSuit struct {
   Person
}
func (this *WearSuit) Decorate(p Person) {
   this.Person = p
}
func (this *WearSuit) show() {
   this.Person.show()
   fmt.Println("西装")
}
type shoes struct {
   Person
}
func (this *shoes) Decorate(p Person) {
   this.Person = p
}
func (this *shoes) show() {
   this.Person.show()
   fmt.Println("鞋子")
}
func main() {
   var xc Person = &Finery{Name: "小菜"}
   ts := &TShirts{}
   ts.Decorate(xc)
   bt := &BigTrouser{}
   bt.Decorate(ts)
   shoes := &shoes{}
   shoes.Decorate(bt)
   shoes.show()
}

运行结果:

go语言设计模式之装饰模式(如此包装)

如果使用继承的话,上面的例子中,想给一个人穿衣服,就需要增加额外的类同时这个类完成穿T恤、垮裤和鞋子。如果一个新的人需要只穿T恤和垮裤,不穿其他的,就需要增加额外的类来完成。根据排列组合,新的需求增加我们就会增加很多的类。如果像上面的代码,我们使用装饰模式,只需要new一个person,然后按顺序的给这个人穿衣服,穿上T恤,然后是垮裤,再是鞋子。如果想穿其他衣服,只需要有一个新的person,然后按顺序的穿,如果想戴帽子,我们只需要增加一个帽子的结构体,然后实现person这个接口,我们就可以给他穿衣服和戴帽子。对于每一个衣服的类,不必关心这个人已经穿了什么,只需要知道自己要做什么就可以,T恤类,只需要知道给这个人穿上T恤就可以。

其实装饰模式可以这样理解,我们有一堵墙,接着我们给墙刷腻子,接着给墙贴壁纸,接着可以挂上自己喜欢的画之类的。这样一层一层的装饰上去,而且装饰的顺序我们也是可以掌控的。

这个模式和建造者有一点像,但是还是有很大区别的。建造者模式我们不需要知道建造的过程,只要获得最终的对象就可以。而装饰模式,我们可以按照自己的想法构造,当我们需要装饰很多东西的时候,而且是经常变化的,我们就需要选择装饰模式。

相关推荐