go语言设计模式之装饰模式(如此包装)
本文主要说一下设计模式之装饰模式,后续会有更多的模式和算法以及区块链相关的,如果你是想学习go语言或者是对设计模式或者算法感兴趣亦或是区块链开发工作者,都可以关注一下。(vx公号,csdn:Go语言之美。更多go语言知识信息等)。
更多go语言相关代码github:
https://github.com/rayyyes
装饰模式:动态的给一个对象添加一些额外的职责。在编程语言中,我们经常使用继承来做到这一点,而装饰模式其实也是多继承的一种实现方式。
我们看一下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() }
运行结果:
如果使用继承的话,上面的例子中,想给一个人穿衣服,就需要增加额外的类同时这个类完成穿T恤、垮裤和鞋子。如果一个新的人需要只穿T恤和垮裤,不穿其他的,就需要增加额外的类来完成。根据排列组合,新的需求增加我们就会增加很多的类。如果像上面的代码,我们使用装饰模式,只需要new一个person,然后按顺序的给这个人穿衣服,穿上T恤,然后是垮裤,再是鞋子。如果想穿其他衣服,只需要有一个新的person,然后按顺序的穿,如果想戴帽子,我们只需要增加一个帽子的结构体,然后实现person这个接口,我们就可以给他穿衣服和戴帽子。对于每一个衣服的类,不必关心这个人已经穿了什么,只需要知道自己要做什么就可以,T恤类,只需要知道给这个人穿上T恤就可以。
其实装饰模式可以这样理解,我们有一堵墙,接着我们给墙刷腻子,接着给墙贴壁纸,接着可以挂上自己喜欢的画之类的。这样一层一层的装饰上去,而且装饰的顺序我们也是可以掌控的。
这个模式和建造者有一点像,但是还是有很大区别的。建造者模式我们不需要知道建造的过程,只要获得最终的对象就可以。而装饰模式,我们可以按照自己的想法构造,当我们需要装饰很多东西的时候,而且是经常变化的,我们就需要选择装饰模式。