装饰模式(Decorator Pattern):动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活。装饰模式是一种对象结构型模式。
装饰模式的实现代码
package main
import "fmt"
// ---------- 抽象层 ----------
//抽象的构件
type Phone interface {
Show() //构件的功能
}
//装饰器基础类(该类本应该为interface,但是Golang interface语法不可以有成员属性)
type Decorator struct {
phone Phone
}
func (d *Decorator) Show() {}
// ----------- 实现层 -----------
// 具体的构件
type HuaWei struct {}
func (hw *HuaWei) Show() {
fmt.Println("秀出了HuaWei手机")
}
type XiaoMi struct{}
func (xm *XiaoMi) Show() {
fmt.Println("秀出了XiaoMi手机")
}
// 具体的装饰器类
type MoDecorator struct {
Decorator //继承基础装饰器类(主要继承Phone成员属性)
}
func (md *MoDecorator) Show() {
md.phone.Show() //调用被装饰构件的原方法
fmt.Println("贴膜的手机") //装饰额外的方法
}
func NewMoDecorator(phone Phone) Phone {
return &MoDecorator{Decorator{phone}}
}
type KeDecorator struct {
Decorator //继承基础装饰器类(主要继承Phone成员属性)
}
func (kd *KeDecorator) Show() {
kd.phone.Show()
fmt.Println("手机壳的手机") //装饰额外的方法
}
func NewKeDecorator(phone Phone) Phone {
return &KeDecorator{Decorator{phone}}
}
// ------------ 业务逻辑层 ---------
func main() {
var huawei Phone
huawei = new(HuaWei)
huawei.Show() //调用原构件方法
fmt.Println("---------")
//用贴膜装饰器装饰,得到新功能构件
var moHuawei Phone
moHuawei = NewMoDecorator(huawei) //通过HueWei ---> MoHuaWei
moHuawei.Show() //调用装饰后新构件的方法
fmt.Println("---------")
var keHuawei Phone
keHuawei = NewKeDecorator(huawei) //通过HueWei ---> KeHuaWei
keHuawei.Show()
fmt.Println("---------")
var keMoHuaWei Phone
keMoHuaWei = NewMoDecorator(keHuawei) //通过KeHuaWei ---> KeMoHuaWei
keMoHuaWei.Show()
}
终端输出
建造者模式的代码拆分
1.项目的准备工作
找到 go 的 GOPATH
$ go env //可以查看 GOPATH
在 GOPATH 目录下创建3个文件夹
1.bin文件夹 -- 存放编译后的二进制文件
2.pkg文件夹 -- 存放编译后的库文件
3.src文件夹 -- 存放源码文件
2.创建文件夹
// -- 在项目文件夹 decoration_case 里创建新文件夹
// decoration -- 存放装饰者的全部文件
3.接口文件 -- decoration文件夹
文件1 -- phone.go
package decoration
//抽象的构件
type Phone interface {
Show() //构件的功能
}
4.结构体文件 -- builde文件夹
1.装饰器基础类
文件1 -- decorator.go
package decoration
//装饰器基础类(该类本应该为interface,但是Golang interface语法不可以有成员属性)
type Decorator struct {
phone Phone
}
func (d *Decorator) Show() {}
2.具体的构件
文件1 --huawei.go
package decoration
import "fmt"
// 华为手机
type HuaWei struct {}
func (hw *HuaWei) Show() {
fmt.Println("秀出了HuaWei手机")
}
文件2 --xiaomi.go
package decoration
import "fmt"
// 小米手机
type XiaoMi struct{}
func (xm *XiaoMi) Show() {
fmt.Println("秀出了XiaoMi手机")
}
3.具体的装饰器类
文件1 -- modecorator.go
package decoration
import "fmt"
// 贴膜装饰器
type MoDecorator struct {
Decorator //继承基础装饰器类(主要继承Phone成员属性)
}
func (md *MoDecorator) Show() {
md.phone.Show() //调用被装饰构件的原方法
fmt.Println("贴膜的手机") //装饰额外的方法
}
func NewMoDecorator(phone Phone) Phone {
return &MoDecorator{Decorator{phone}}
}
文件2 -- kedecorator.go
package decoration
import "fmt"
// 手机壳装饰器
type KeDecorator struct {
Decorator //继承基础装饰器类(主要继承Phone成员属性)
}
func (kd *KeDecorator) Show() {
kd.phone.Show()
fmt.Println("手机壳的手机") //装饰额外的方法
}
func NewKeDecorator(phone Phone) Phone {
return &KeDecorator{Decorator{phone}}
}
5.主文件 -- main.go 在项目文件夹
package main
import (
"design/decoration_case/decoration"
"fmt"
)
// 具体工作
func main() {
var huawei decoration.Phone
huawei = new(decoration.HuaWei)
huawei.Show() //调用原构件方法
fmt.Println("---------")
//用贴膜装饰器装饰,得到新功能构件
var moHuawei decoration.Phone
moHuawei = decoration.NewMoDecorator(huawei) //通过HueWei ---> MoHuaWei
moHuawei.Show() //调用装饰后新构件的方法
fmt.Println("---------")
var keHuawei decoration.Phone
keHuawei = decoration.NewKeDecorator(huawei) //通过HueWei ---> KeHuaWei
keHuawei.Show()
fmt.Println("---------")
var keMoHuaWei decoration.Phone
keMoHuaWei = decoration.NewMoDecorator(keHuawei) //通过KeHuaWei ---> KeMoHuaWei
keMoHuaWei.Show()
}