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

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

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. How To Build Kubernetes Platform (构建Kubernetes平台方案参考)

    Architecture Architecture Diagram Non-Prod Environment Prod Environment Cluster Networking Container ...

  2. 前端基础入门第一阶段-Web前端开发基础环境配置

    Web前端和全栈的定义: A.什么是传统传统web前端:需要把设计师的设计稿,切完图,写标签和样式,实现JS的效果,简而言之即只需要掌握HTML的页面结构,CSS的页面样式,javaScript页面的 ...

  3. Asp.Net Core 入门(二)——Startup.cs做了什么

    上篇介绍了Program.cs中Main做了什么,这篇我们来讨论下Startup.cs它又做了什么呢? 我们新建一个Asp.Net Core Mvc项目,先来开一下Startup的代码 public ...

  4. Python list 增加/插入元素的说明

    http://blog.csdn.net/cnmilan/article/details/9259343 在Python中append 用来向 list 的末尾追加单个元素,如果增加的元素是一个lis ...

  5. Python打包成exe,pyc

    D:\mypython\path\ C:\Python27\Scripts\pyinstaller.exe -w mypython.py # Python打包成exe D:\mypython\path ...

  6. git命令使用(一)

    作为程序员怎么能不了解git命令呢,但是由于本人不常用到git命令,现在的软件上也都一体化了,能够简化命令,直接运行都可以了,完全能够去实现git上的命令,导致输入git命令完全不会,git命令能够让 ...

  7. luogu P3393 逃离僵尸岛-搜索剪枝+spfa

    P3393 逃离僵尸岛 题目描述 小a住的国家被僵尸侵略了!小a打算逃离到该国唯一的国际空港逃出这个国家. 该国有N个城市,城市之间有道路相连.一共有M条双向道路.保证没有自环和重边. K个城市已经被 ...

  8. [LUOGU] P2704 炮兵阵地

    题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队. 一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示), 也可能是平原(用"P&q ...

  9. js 函数节流和防抖

    js 函数节流和防抖 throttle 节流 事件触发到结束后只执行一次. 应用场景 触发mousemove事件的时候, 如鼠标移动. 触发keyup事件的情况, 如搜索. 触发scroll事件的时候 ...

  10. 条款15:在资源管理类中提供对原始资源的访问(Provide access to raw resources in resource-managing classes)

    NOTE: 1.APIs往往要求访问原始资源(raw resources),所以每一个RAII class应该提供一个“取得其所管理之资源”的办法. 2.对原始资源的访问可能经由显示转换或隐式转换.一 ...