模板方法模式结构图如下。原理是过程实现不一样,但是执行的顺序是按照模板固定好了的。即简单理解为都有1,2,3步骤,但是每一步的实现交由具体实现类不同实现。

1.过程式编程

 // 模板方法模式
package main import "fmt" type Template interface {
fun1()
fun2()
} //此处采取过程式编程,因为Go没有抽象类的概念
func result(t Template) {
t.fun1()
t.fun2()
} type ConcreteA struct{} func (c *ConcreteA) fun1() {
fmt.Println("A类实现fun1")
} func (c *ConcreteA) fun2() {
fmt.Println("A类实现fun2")
} type ConcreteB struct{} func (c *ConcreteB) fun1() {
fmt.Println("B类实现fun1")
} func (c *ConcreteB) fun2() {
fmt.Println("B类实现fun2")
} func main() {
// var ta = new(ConcreteA)
// result(ta) var tb = new(ConcreteB)
result(tb)
}

2.面向对象编程

 // 模板方法模式
package main import "fmt" type Template interface {
fun1()
fun2()
Result()
} // 抽象结构体
type Funcs struct {
temp Template
} // 抽象结构体部分实现接口
func (r *Funcs) Result() {
r.temp.fun2()
r.temp.fun1()
} //A具体实现。继承自抽象结构体的方法+自身实现的方法=实现Template接口
type ConcreteA struct {
//会继承抽象结构体中的方法
Funcs
} func (c *ConcreteA) fun1() {
fmt.Println("A类实现fun1")
} func (c *ConcreteA) fun2() {
fmt.Println("A类实现fun2")
} //B具体实现。继承自抽象结构体的方法+自身实现的方法=实现Template接口
type ConcreteB struct {
//会继承抽象结构体中的方法
Funcs
} func (c *ConcreteB) fun1() {
fmt.Println("B类实现fun1")
} func (c *ConcreteB) fun2() {
fmt.Println("B类实现fun2")
} func main() {
interf := new(ConcreteB)
fmt.Printf("%P \n", interf.Funcs)
// interf.Result() 此处报空指针错误,因为new(ConcreteB),其中方法Funcs并未实例化,也就不存在Result() ta := Funcs{temp: interf}
ta.Result()
}

最新文章

  1. Linux 下 查看以及修改文件权限
  2. CSS3按钮效果
  3. UIImage两种初始化的区别
  4. Linux_shell脚本_遍历文件夹下所有文件
  5. POI对Excel
  6. poj2676 Sudoku(DFS)
  7. 百度翻译API
  8. Game shader or System shader is busy ::VS CSG
  9. hdu 5585 Numbers【大数+同余定理】
  10. linux 文本编辑器 vim 基本操作
  11. 基于CAShapeLayer以及UIBezierPath的语音输入效果动画封装
  12. Android-x86虚拟机安装配置全攻略
  13. LA 3882
  14. dependency injection via inversion of control
  15. EntityFramework6.X 之DbContex
  16. mac os x下Dreamweaver如何还原初始配置
  17. CentOS Android Studio桌面图标的创建
  18. 跨域iframe如何通信
  19. Solr在Linux中的安装
  20. 【原理、应用】Quartz集群原理及配置应用

热门文章

  1. VC++ LPARAMA 转换成CString
  2. Swift学习笔记(6):控制流
  3. jq操作属性,元素,样式,事件
  4. MySQL内置函数uuid和uuid_short
  5. HDU 1704 Rank【传递闭包】
  6. LA3231 Fair Share 二分_网络流
  7. while循环,格式化输出%,运算符,数据类型的转换,编码的初识,
  8. ActiveMQ:JMS开源框架入门介绍
  9. Mysql学习总结(23)——MySQL统计函数和分组查询
  10. 洛谷 P3671 [USACO17OPEN]Where's Bessie? 贝西在哪呢