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

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

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

package doc

import "fmt"

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

我们把这两个类,提取出一个父类,DocSuper。这个类中有两个函数,一个具体的函数,DoOperate,用来做实际的操作。一个抽象函数,等待子类实现,用来获取不同文档类型的内容。其实,我们只是等待子类实现这个抽象函数,好为父类的DoOperate来提供数据:)。 
另外,我们最最好用的Go语言,是没有抽象类,抽象函数之类的概念的,所以我使用了一个指向一个函数的指针(func() string)来模拟实现抽象函数。如果我们的子类需要“实例化”这个“抽象函数”(实质是子类给这个父类函数指针赋值),就必须满足我们的指针约束。

2.定义子类

package doc

type 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 doc

type 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.go
package main import . "doc" func main() {
netDoc := NewNetDoc()
lcDoc := NewLocalDoc() netDoc.DoOperate()
lcDoc.DoOperate()
}
/*
输出:
对这个文档做了一些处理,文档是: this is net doc.
对这个文档做了一些处理,文档是: this is a LocalDoc.
*/

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

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

 
 

Go --- 设计模式(模板模式)的更多相关文章

  1. 12. 星际争霸之php设计模式--模板模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  2. 【设计模式】Java设计模式 - 模板模式

    Java设计模式 - 模板模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起记录分享自己 ...

  3. C# - 设计模式 - 模板模式

    模板模式 问题场景 咖啡和茶派生于抽象类饮料,咖啡和茶都具有烧水的方法,所以可以将烧水的方法提取到抽象类饮料中去实现,而咖啡具有一个向杯子加咖啡粉的方法,茶具有一个向杯子加茶叶的方法,看起来两个方法是 ...

  4. 设计模式——模板模式(Template Pattern)

    在读Spring源码的时候,发现Spring代码中运用了大量的模板模式,比如根据文件系统目录加载配置文件(FileSystemXmlApplicationContext),类路径加载配置文件(Clas ...

  5. php设计模式——模板模式

    最近打算巩固,整理一下设计模式相关的内容.这篇是关于  ——模板模式! 原文:http://www.jb51.net/article/76052.htm ----------------------- ...

  6. Spring中常见的设计模式——模板模式

    一.模板模式的应用场景 模板模式又叫模板方法模式(Template Method Pattern),指定义一个算法的骨架,并允许自雷为一个或者多个步骤提供实现.模板模式使得子类可以在不改变算法结果的情 ...

  7. 设计模式——模板模式(C++实现)

    模板模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤.   模板模式通过把不变的行为搬移到超类,去除子类中的重复代码来 ...

  8. Java设计模式-模板模式

    介绍:模板模式定义了一个模板抽象类,这个抽象类中定义了方法调用的形式,顺序.子类通过重写对方法进行实现,但是调用方式不能改变. 模板模式中的模板中定义了核心的代码骨架,一些有着不同方式实现的代码放在子 ...

  9. C++ 设计模式--模板模式、策略模式、观察者模式

    现代软件设计特征:需求频繁变化 设计模式的要点是"寻找变化点",在变化点应用设计模式,从而更好的应对需求变化. 1. Template Method 在软件构建结构中,往往他有整体 ...

随机推荐

  1. 多线程中 CountDownLatch CyclicBarrier Semaphore的使用

    CountDownLatch 调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行.也可以传入时间,表示时间到之后,count还没有为0的时候,就会继续执行. package ...

  2. Linux目录结构及详细介绍

    /:根目录,位于Linux文件系统目录结构的顶层,一般根目录下只存放目录,不要存放文件,/etc./bin./dev./lib./sbin应该和根目录放置在一个分区中. /bin,/usr/bin:该 ...

  3. 最短路 || UOJ 19 寻找道路

    UOJ j19 寻找道路 在有向图G中,每条边的长度均为 1,现给定起点和终点,请你在图中找一条从起点到终点的最短路径,该路径满足以下条件: 路径上的所有点的出边所指向的点都直接或间接与终点连通. * ...

  4. [IOS初学]ios 第一篇 storyboard 与viewcontroller的关系 - Zoe_J

    时间 2014-07-27 16:08:00  博客园-所有随笔区 原文  http://www.cnblogs.com/zoe-j/p/3871501.html 主题 StoryBoard 学习了一 ...

  5. LInux设备驱动分析—— kmalloc和kzalloc函数

    今晚在研究EVM5728开发板上面Linux系统的IIC设备驱动程序,偶然之间看到驱动程序中有一处使用了kzalloc函数,本人之前都是使用Linux内核提供的kmalloc / kfree函数来给设 ...

  6. ubuntu 宝塔安装一条龙服务

    ubuntu 安装 1, wget -O install.sh http://download.bt.cn/install/install-ubuntu.sh && sudo bash ...

  7. Java:Md5加密

    文章来源:https://www.cnblogs.com/hello-tl/p/9139334.html import java.security.MessageDigest; public clas ...

  8. 【实验吧】转瞬即逝write up

    ---恢复内容开始--- 虽然这是很简单的一道题,但这是我第一次拿着题有很清晰的思路,并且脚本也有思路写,拿到文件用ida打开,分析main函数: int __cdecl main(int argc, ...

  9. PyMySQL操作mysql数据库(py3必学)

    一,安装PyMySQL Python是编程语言,MySQL是数据库,它们是两种不同的技术:要想使Python操作MySQL数据库需要使用驱动.这里选用PyMySQL驱动. 安装方式还是使用pip命令. ...

  10. URAL 1277 Cops and Thieves

    Cops and Thieves Time Limit: 1000ms Memory Limit: 16384KB This problem will be judged on Ural. Origi ...