博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Go --- 设计模式(模板模式)
阅读量:7053 次
发布时间:2019-06-28

本文共 1643 字,大约阅读时间需要 5 分钟。

模版模式真的是一个好东西。所谓模版模式,就是说,某几个类中相同的操作和代码提取到父类的一个函数中,并定义相同的操作为抽象函数。由子类来实现。估计我也没表达清楚,下面还是看代码来讲解吧。

例:我们有两个文档处理程序,一个处理本地数据,一个处理网络数据。这两个类的功能和执行步骤高度类似,但是,获取数据的方式不同。在这两个类中势必存在大量结构相同的代码。现在,我们使用模版模式来重构这两个类。

1.定义父类,在父类中定义实现的具体函数和一个等待子类实例化的“抽象函数”

package docimport "fmt"type DocSuper struct { GetContent func() string } func (d DocSuper) DoOperate() { fmt.Println("对这个文档做了一些处理,文档是:", d.GetContent()) }

 

我们把这两个类,提取出一个父类,DocSuper。这个类中有两个函数,一个具体的函数,DoOperate,用来做实际的操作。一个抽象函数,等待子类实现,用来获取不同文档类型的内容。其实,我们只是等待子类实现这个抽象函数,好为父类的DoOperate来提供数据:)。 

另外,我们最最好用的语言,是没有抽象类,抽象函数之类的概念的,所以我使用了一个指向一个函数的指针(func() string)来模拟实现抽象函数。如果我们的子类需要“实例化”这个“抽象函数”(实质是子类给这个父类函数指针赋值),就必须满足我们的指针约束。

2.定义子类

package doctype LocalDoc struct {    DocSuper}func NewLocalDoc() *LocalDoc {    c := new(LocalDoc) c.DocSuper.GetContent = c.GetContent return c } func (e *LocalDoc) GetContent() string { return "this is a LocalDoc." }

 

package doctype NetDoc struct {    DocSuper}func NewNetDoc() *NetDoc {    c := new(NetDoc) c.DocSuper.GetContent = c.GetContent return c } func (c *NetDoc) GetContent() string { return "this is net doc." }

大家仔细看代码就能发现,我们的子类中可以包含父类的结构,虽然go语言不能继承,但是通过这种方式,我们也能过一过“继承”的瘾。当我们使用NewNetDoc函数实例化的时候,在这个函数中,会把子类的函数指针赋值给父类的函数指针。此时,子类中包含了父类的结构,故而我们能调用父类的函数来完成功能。

3.接下来就是了。。。。。。。。

// 模版模式 project main.gopackage mainimport . "doc"func main() {    netDoc := NewNetDoc()    lcDoc := NewLocalDoc()    netDoc.DoOperate()    lcDoc.DoOperate()   }/*输出:对这个文档做了一些处理,文档是: this is net doc. 对这个文档做了一些处理,文档是: this is a LocalDoc. */

在go语言中,如果子类包含了父类的结构,我们就能直接用子类“.”出父类的函数。这不得不说是一个伟大的特性。它让我们的“继承”更加天衣无缝了。

总结:通过模版模式,我们可以把子类做为父类的模版,提取出公共的结构到父类,共享父类的代码。这样能消除代码结构重复的坏味。并且,简化了子类的功能,使之职责单一的为“父类”提供数据。

 
 

转载地址:http://ewlol.baihongyu.com/

你可能感兴趣的文章
.Net魔法堂:AssemblyInfo.cs文件详解
查看>>
(转)NGUI制作转圈的技能CD特效
查看>>
Spring JMX之三:通知的处理及监听
查看>>
Python 函数
查看>>
【剑指offer】合并两有序单链表
查看>>
HDU 4360 As long as Binbin loves Sangsang spfa
查看>>
IT痴汉的工作现状24-Just for fun
查看>>
10个必需的iOS开发工具和资源
查看>>
如何专注
查看>>
IntelliJ IDEA常见问题解决办法汇总
查看>>
[LeetCode] Container With Most Water 装最多水的容器
查看>>
poj 3624 Charm Bracelet 背包DP
查看>>
用dedecms自定义表单创建简易自助预约系统
查看>>
读《了解你的学生》有感
查看>>
dedecms /member/flink_main.php SQL Injection Vul
查看>>
Dropbox Folder Sync – 让 Dropbox 同步任意文件夹
查看>>
PHP 网页爬虫
查看>>
用户队列服务API
查看>>
C# word开发
查看>>
spring mvc 与 jasper Report集成
查看>>