Go --- 设计模式(模板模式)
模版模式真的是一个好东西。所谓模版模式,就是说,某几个类中相同的操作和代码提取到父类的一个函数中,并定义相同的操作为抽象函数。由子类来实现。估计我也没表达清楚,下面还是看代码来讲解吧。
例:我们有两个文档处理程序,一个处理本地数据,一个处理网络数据。这两个类的功能和执行步骤高度类似,但是,获取数据的方式不同。在这两个类中势必存在大量结构相同的代码。现在,我们使用模版模式来重构这两个类。
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 --- 设计模式(模板模式)的更多相关文章
- 12. 星际争霸之php设计模式--模板模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- 【设计模式】Java设计模式 - 模板模式
Java设计模式 - 模板模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起记录分享自己 ...
- C# - 设计模式 - 模板模式
模板模式 问题场景 咖啡和茶派生于抽象类饮料,咖啡和茶都具有烧水的方法,所以可以将烧水的方法提取到抽象类饮料中去实现,而咖啡具有一个向杯子加咖啡粉的方法,茶具有一个向杯子加茶叶的方法,看起来两个方法是 ...
- 设计模式——模板模式(Template Pattern)
在读Spring源码的时候,发现Spring代码中运用了大量的模板模式,比如根据文件系统目录加载配置文件(FileSystemXmlApplicationContext),类路径加载配置文件(Clas ...
- php设计模式——模板模式
最近打算巩固,整理一下设计模式相关的内容.这篇是关于 ——模板模式! 原文:http://www.jb51.net/article/76052.htm ----------------------- ...
- Spring中常见的设计模式——模板模式
一.模板模式的应用场景 模板模式又叫模板方法模式(Template Method Pattern),指定义一个算法的骨架,并允许自雷为一个或者多个步骤提供实现.模板模式使得子类可以在不改变算法结果的情 ...
- 设计模式——模板模式(C++实现)
模板模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 模板模式通过把不变的行为搬移到超类,去除子类中的重复代码来 ...
- Java设计模式-模板模式
介绍:模板模式定义了一个模板抽象类,这个抽象类中定义了方法调用的形式,顺序.子类通过重写对方法进行实现,但是调用方式不能改变. 模板模式中的模板中定义了核心的代码骨架,一些有着不同方式实现的代码放在子 ...
- C++ 设计模式--模板模式、策略模式、观察者模式
现代软件设计特征:需求频繁变化 设计模式的要点是"寻找变化点",在变化点应用设计模式,从而更好的应对需求变化. 1. Template Method 在软件构建结构中,往往他有整体 ...
随机推荐
- Codeforces Gym 2015 ACM Arabella Collegiate Programming Contest(二月十日训练赛)
A(By talker): 题意分析:以a(int) op b(int)形式给出两个整数和操作符, 求两个整数是否存在操作符所给定的关系 ,有则输出true,无则输出false: 思路:由于无时间复杂 ...
- 【转】Delphi 文件读写
procedure TForm1.Button1Click(Sender: TObject); variFileHandle: Integer;iFileLength: Integer;iBytesR ...
- 如何安装多个pip包
要在命令行上安装多个软件包,只需将它们作为以空格分隔的列表传递,例如: pip install wsgiref boto
- CPP-基础:文字常量区
内存不可写 char* 先看一个例子 ///////////// //代码1 #include <string> main() { char *buf = "good morni ...
- 枚举 || CodeForces 742B Arpa’s obvious problem and Mehrdad’s terrible solution
给出N*M矩阵,对于该矩阵有两种操作: 1.交换两列,对于整个矩阵只能操作一次 2.每行交换两个数. 交换后是否可以使每行都递增. *解法:N与M均为20,直接枚举所有可能的交换结果,进行判断 每次枚 ...
- mysql中ibatis的limit动态传参
param.put("pageNo",pageNo); param.put("pageSize",pageSize); sqlMap中的用法 limit $ ...
- ios 之sqllite
iOS sqlite数据库操作.步骤是: 先加入sqlite开发库libsqlite3.dylib, 新建或打开数据库, 创建数据表, 插入数据, 查询数据并打印 1.新建项目sqliteDemo,添 ...
- 洛谷 P2858 奶牛零食
https://www.luogu.org/problemnew/show/P2858 毫无疑问区间dp. ![区间dp入门] 我们定义dp[i][j]表示从i到j的最大收益,显然我们需要利用比较小的 ...
- luogu P1042 乒乓球
题目背景 国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及.其中11分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退役.华华就是其中一位,他退役 ...
- (11) openssl req(生成请求证书、私钥和自建CA)
伪命令req大致有3个功能:生成证书请求文件.验证证书请求文件和创建根CA. 由于openssl req命令选项较多,所以先各举几个例子,再集中给出openssl req的选项说明.若已熟悉opens ...