装饰器模式
装饰器模式动态的把功能附加到对象上。若要扩展功能,装饰器提供了比继承更有弹性的替代方案。
在我们设计的过程中,要对扩展开放,对修改关闭,多用组合,少用继承。针对接口编程,不针对实现编程。为交互对象之间的松耦合设计而努力。你可以用无数个装饰者包装一个组件,而无需修改组件的代码。
装饰器的实现方法:
- 设计一个接口Calculate,定义该接口的一些方法
- 申明一个基础对象结构体OriCalculate,实现这个接口
- 申明一个对象的结构体MutCalculate,实现这个接口并新增部分参数,同时更新了接口的方法
- 申明另一个对象结构体AddCalculate,实现这个接口并新增另外的参数,更新接口方法
- 初始化基础对象结构OriCalculate,并用这个基础对象结构去初始化装饰者MutCalculate和AddCalculate,分别实现不同的功能。
这样可以不用修改基础结构对象OriCalculate的代码,而通过调用共同实现接口的新的对象结构体实现了不同的功能。
Go语言借助于匿名组合和非入侵式接口可以很方便实现装饰模式。
decorator.go
package decorator
type Calculate interface {
Cal() int
}
//创建一个基准struct,后面的装饰器给这个基准struct加功能
type OriCalculate struct {
num int
}
func NewOriCalculate(num int)*OriCalculate{
return &OriCalculate{num:num}
}
func (o *OriCalculate)Cal() int{
return o.num
}
//创建基于基准struct的乘法
type MutCalculate struct {
Calculate
num int
}
func NewMutCalculate(C Calculate,num int) *MutCalculate {
return &MutCalculate{Calculate:C,num:num}
}
func (m *MutCalculate) Cal() int {
return m.num*m.Calculate.Cal()
}
//创建基于基准struct的加法
type AddCalculate struct {
Calculate
num int
}
func NewAddCalculate(C Calculate,num int) *AddCalculate {
return &AddCalculate{Calculate:C,num:num}
}
func (a *AddCalculate)Cal()int {
return a.num+a.Calculate.Cal()
}
decorator_test.go
package decorator
import "log"
func ExampleDecorator() {
//o:=NewOriCalculate(1)
//定义的时候,接口实现的是指针接收,所以用指针初始化
o:=&OriCalculate{1}
m:=MutCalculate{o,2}
a:=AddCalculate{o,3}
log.Printf("Oricalculate is %d \n MutCalculate is %d\n AddCalculate is %d \n",o.Cal(),m.Cal(),a.Cal())
// Output: The output of
// this example.
}
在目录下执行go test,可自动执行ExampleObserver函数
有疑问加站长微信联系(非本文作者)