学习Go语言之装饰器模式

摘要:
实现接口并定义它自己的事件DecorateFun,它相当于抽象类6typeDecoratestruct{7//抽象类8decorateIDecorate9}1011funcDecorateFun{12c.decorate=i13}1415funcDo(){16ifc.decorate!

一,首先理解装饰器模式:动态的给一个对象增加一些额外的职责,这是在软件设计原则上面,一个功能装饰另一个功能,每个功能遵循同一个接口是这个模式的特征。

学习Go语言之装饰器模式第1张

二,定义对象接口和装饰抽象类

 1 type IDecorate interface {
 2     Do()
 3 }
 4 
 5 // 装饰器。实现接口,又定义了自己的事件DecorateFun,相当于抽象类
 6 type Decorate struct {
 7     // 待装饰的抽象类
 8     decorate IDecorate
 9 }
10 
11 func (c *Decorate) DecorateFun(i IDecorate) {
12     c.decorate = i
13 }
14 
15 func (c *Decorate) Do() {
16     if c.decorate != nil {
17         c.decorate.Do()
18     }
19 }

三,具体的装饰类

 1 // 具体A装饰
 2 type DecorateA struct {
 3     Base Decorate
 4 }
 5 
 6 // 重写方法,隐式实现接口
 7 func (c *DecorateA) Do() {
 8     fmt.Printf("执行A装饰")
 9     c.Base.Do()
10 }
11 
12 // 具体B装饰
13 type DecorateB struct {
14     Base Decorate
15 }
16 
17 // 重写方法,隐式实现接口
18 func (c *DecorateB) Do() {
19     fmt.Printf("执行B装饰")
20     c.Base.Do()
21 }
22 
23 // 具体C装饰
24 type DecorateC struct {
25     Base Decorate
26 }
27 
28 // 重写方法,隐式实现接口
29 func (c *DecorateC) Do() {
30     fmt.Printf("执行C装饰")
31     c.Base.Do()
32 }

四,客户端调用。此处需要注意避免贪吃蛇无限循环问题

1 func main() {
2     a := new(DecorateA)
3     b := new(DecorateB)
4     c := new(DecorateC)
5     b.Base.DecorateFun(a)
6     c.Base.DecorateFun(b)
7     c.Do()
8 }

学习Go语言之装饰器模式第2张

免责声明:文章转载自《学习Go语言之装饰器模式》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇JS控制div跳转到指定的位置的解决方案总结input type date 解决移动端显示placeholder下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Go语言基础之数组

Go语言基础之数组 本文主要介绍数组(array)及它的基本使用。 Array(数组) 数组是同一种数据类型元素的集合。 在Go语言中,数组从声明时就确定,使用时可以修改数组成员,但是数组大小不可变化。 基本语法: // 定义一个长度为3元素类型为int的数组a var a [3]int 数组定义: var 数组变量名 [元素数量]T 比如:var a...

Go 字符串拼接6种,最快的方式 strings.builder

我们首先来了解一下Go语言中string类型的结构定义,先来看一下官方定义: // string is the set of all strings of 8-bit bytes, conventionally but not// necessarily representing UTF-8-encoded text. A string may be em...

GO程序设计1——快速入门

1.GO语言开发环境搭建                                             1.1编译环境安装 点击链接http://code.google.com/p/go/downloads/list 选择一个版本,本人下载的是go1.0.3.windows-386.msi 双击安装,选择安装一个安装主目录:例如,C:\Go,不需...

Go语言的调度模型(GPM)

GPM模型 定义于src/runtime/runtime2.go G: Gourtines(携带任务), 每个Goroutine对应一个G结构体,G保存Goroutine的运行堆栈,即并发任务状态。G并非执行体,每个G需要绑定到P才能被调度执行。 P: Processors(分配任务), 对G来说,P相当于CPU核,G只有绑定到P(在P的local ru...

Go语言JSON数据相互转换

目录 结构体转json map转json int转json slice转json json反序列化为结构体 json反序列化为map 结构体转json 结构体转json示例: package main import ( "encoding/json" "fmt" ) //用户 type User struct { UserName st...

30. 如何使用 GDB 调试 Go 程序?

Hi,大家好,我是明哥。 在自己学习 Golang 的这段时间里,我写了详细的学习笔记放在我的个人微信公众号 《Go编程时光》,对于 Go 语言,我也算是个初学者,因此写的东西应该会比较适合刚接触的同学,如果你也是刚学习 Go 语言,不防关注一下,一起学习,一起成长。 我的在线博客:http://golang.iswbm.com 我的 Github:git...