设计模式Go实现-结构类型

装饰模式

用于动态或静态的给一个对象添加动作或行为属性。

装饰器结构模式允许动态扩展现有对象的功能而不改变其内部代码。

一个已经存在的对象,经历过一个特性装饰器的修饰之后再进行返回对象。此时对象已经被加上,并且不用修改原有对象的内部结构。

//定义一个装饰器,装饰器会将原对象的同类型结构返回回去。返回的对象,其实是在原对象外部加上了部分功能。
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")

代理器,可根据我们想代理的方式。在代理的时候,加入不同的代理动作。

小结:

代理器,可根据我们想代理的方式。在代理的时候,加入不同的代理动作。另外代理器的结构也不仅定义传入一个被代理对象。代理器完全可以根据代理的算法,在本身的结构中加入所需要的属性或是方法处理功能。

转载于:https://my.oschina.net/u/4156317/blog/3080293

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值