装饰模式
用于动态或静态的给一个对象添加动作或行为属性。
装饰器结构模式允许动态扩展现有对象的功能而不改变其内部代码。
一个已经存在的对象,经历过一个特性装饰器的修饰之后再进行返回对象。此时对象已经被加上,并且不用修改原有对象的内部结构。
//定义一个装饰器,装饰器会将原对象的同类型结构返回回去。返回的对象,其实是在原对象外部加上了部分功能。
type object func(n int) int
func LogDecorate(fn object)object{
return func(n int)int{
log.Println("print some log content")
result := fn(n)
log.Println("print some log content againt")
return result
}
}
//使用装饰器来对旧对象进行功能对叠加。
func Double(n int)int{
return n*2
}
f := LogDecoreate(Double)
f(5)
小结:
装饰器模式,和横切面或函数拦截器一样。对原有对对象进行拦截,然后加上一些额外对功能。然后以类型形式将原对象返回回去。就犹如结构体嵌套一样对道理,在外部再加上一层,而不改变原对象对原有功能。
- 和适配器模式不一样,装饰器需要获得被装饰对象。
- 装饰器不能对被装饰对象进行内部注入。
代理模式
代理模式提供一个代理对象。此代理对象用来控制和拦截,对被代理对象对访问。
代理器能够代理连接任何东西。例如:一个网络连接,一个文件,一个内存对象,或者是其他的一些资源。
//首先是定义出将会被代理对象的接口。
type Iobject interface{
ObjDo(action string)
}
//一个被代理的具体实现对象
type object struct{
action string
}
func (obj *object)ObjDo(action string){
fmt.Print("do something",action)
}
//一个用于代理被代理对象的 代理器
type ProxyObject struct{
object *Object
/*
代理器完全可以根据自己的代理算法需要,额外加上一些属性和方法。
name string
rule string
*/
}
func (p *ProxyObject)ObjDo(action string){
if p.Object == nil {
p.Object = new(object)
}
if action == "Run"{
//或者在此处加上一些代理器所需要做的额外动作。或一些基于算法或对象选择的动作。
p.Object.ObjDo(action)
}
}
//---代理器的使用方法----
pobj := ProxyObject{}
pobj.ObjDo("Run")
代理器,可根据我们想代理的方式。在代理的时候,加入不同的代理动作。
小结:
代理器,可根据我们想代理的方式。在代理的时候,加入不同的代理动作。另外代理器的结构也不仅定义传入一个被代理对象。代理器完全可以根据代理的算法,在本身的结构中加入所需要的属性或是方法处理功能。