Go语言基础模板设计模式示例详解

 更新时间:2021年11月17日 09:12:23   作者:package main  
这篇文章主要为大家介绍了Go语言基础设计模式之模板模式的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步

概述

模板方法模式定义了一个算法的步骤,并允许子类别为一个或多个步骤提供其实践方式。让子类别在不改变算法架构的情况下,重新定义算法中的某些步骤

确定了步骤的执行顺序,单某些步骤因环境或人等因素具体实现是未知的

模板模式生活案例

请客吃饭【点菜->吃东西->结账】,每个人点菜不一样,吃东西不一样,结账也不一样从某地到某地【起点->出行方式->终点】起点和终点不一一样,但是每个人出行方式是不一样的

Go没有封装、继承、多态这些概念,但同样通过别的方式可以实现这些特性

  • 封装:通过方法实现
  • 继承:通过匿名字段实现
  • 多态:通过接口实现

策略模式涉及到两个角色

编号 角色 描述
1 抽象父类(AbstractClass) 实现了模板方法,定义了算法的骨架
2 具体类(ConcreteClass) 实现抽象类中的抽象方法,即不同的对象的具体实现细节

UML

在这里插入图片描述

总结

优点:

  • 封装不变部分,扩展可变部分。
  • 提取公共代码,便于维护。
  • 行为由父类控制,子类实现。

缺点:

每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大

使用场景:

有多个子类共有的方法,且逻辑相同

重要的、复杂的方法,可以考虑作为模板方法

示例

package main
import "fmt"
/*出行方式接口*/
type Itravel interface {
	Starting() //起点
	Travel()   //出行方式
	End()      //终点
}
//定义父类
type Persion struct {
	Name    string //姓名
	Itravel Itravel  //出行方式接口
}
func (persion *Persion) SetName(name string) {
	persion.Name = name
}
func (persion Persion) Starting() {
	persion.Itravel.Starting()
}
func (persion Persion) Travel() {
	persion.Itravel.Travel()
}
func (persion Persion) End() {
	persion.Itravel.End()
}
//算法骨架
func (persion Persion) Start() {
	if persion.Itravel == nil {
		fmt.Println("Itravel is nil")
		return
	}
	fmt.Printf("%s", persion.Name)	
	persion.Starting()
	persion.Travel()
	persion.End()
	fmt.Println("\n")
}
//具体类:张三
type ZhangSan struct {
	Persion //匿名字段实现继承
}
func NewZhangSan() *ZhangSan {
	c := new(ZhangSan)
	c.Persion = Persion{Itravel: c}
	return c
}
func (_ ZhangSan) Starting() {
	fmt.Printf("从%s出发", "北京")
}

func (_ ZhangSan) Travel() {
	fmt.Printf(" %s", "火车")
}
func (_ ZhangSan) End() {
	fmt.Printf(" %s", "到达上海")
}
//具体类:李四
type LiSi struct {
	Persion
}
func (_ LiSi) Starting() {
	fmt.Printf("从%s出发", "广州")
}
func (_ LiSi) Travel() {
	fmt.Printf(" %s", "坐飞机")
}
func (_ LiSi) End() {
	fmt.Printf(" %s", "到达重庆")
}
func main() {
	//张三
	zhangsan := NewZhangSan()
	zhangsan.SetName("张三")
	zhangsan.Start()
	persion := &Persion{}
	persion.SetName("张三")
	persion.Itravel = ZhangSan{}
	persion.Start()
	//李四
	persion.SetName("李四")
	persion.Itravel = &LiSi{}
	persion.Start()
	lisi := LiSi{}
	lisi.Itravel = lisi
	lisi.SetName("李四")
	lisi.Start()
}

以上就是Go语言基础模板设计模式示例详解的详细内容,更多关于Go语言模板设计模式的资料请关注脚本之家其它相关文章!

相关文章

  • Golang接口型函数使用小结

    Golang接口型函数使用小结

    接口函数指的是用函数实现接口,这样在调用的时候就会非常简便,这种方式适用于只有一个函数的接口,这里以迭代一个map为例,演示这一实现的技巧,对Golang接口型函数使用知识感兴趣的朋友一起看看吧
    2022-06-06
  • 基于Golang container/list实现LRU缓存

    基于Golang container/list实现LRU缓存

    Least Recently Used (LRU) ,即逐出最早使用的缓存,这篇文章主要为大家介绍了如何基于Golang container/list实现LRU缓存,感兴趣的可以了解下
    2023-08-08
  • Golang中使用Date进行日期格式化(沿用Java风格)

    Golang中使用Date进行日期格式化(沿用Java风格)

    这篇文章主要介绍了Golang中使用Date进行日期格式化,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • GOLang IO接口与工具使用方法讲解

    GOLang IO接口与工具使用方法讲解

    这篇文章主要介绍了GOLang IO接口与工具使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-03-03
  • Golang 字符串与字节数组互转的实现

    Golang 字符串与字节数组互转的实现

    在Go语言中,我们经常在字符串和切片之间进行转换,本文就详细的介绍一下Golang 字符串与字节数组互转的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • 深入学习Golang并发编程必备利器之sync.Cond类型

    深入学习Golang并发编程必备利器之sync.Cond类型

    Go 语言的 sync 包提供了一系列同步原语,其中 sync.Cond 就是其中之一。本文将深入探讨 sync.Cond 的实现原理和使用方法,帮助大家更好地理解和应用 sync.Cond,需要的可以参考一下
    2023-05-05
  • Go语言类型内嵌和结构体内嵌的具体使用

    Go语言类型内嵌和结构体内嵌的具体使用

    本文主要介绍了Go语言类型内嵌和结构体内嵌的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Go语言单例模式详解

    Go语言单例模式详解

    本文主要介绍了Go语言单例模式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • Sublime Text3安装Go语言相关插件gosublime时搜不到gosublime的解决方法

    Sublime Text3安装Go语言相关插件gosublime时搜不到gosublime的解决方法

    本文主要介绍了Sublime Text3安装Go语言相关插件gosublime时搜不到gosublime的解决方法,具有一定的参考价值,感兴趣的可以了解一下
    2022-01-01
  • 利用go语言编写一个并发包

    利用go语言编写一个并发包

    这篇文章主要为大家详细介绍了如何利用go语言编写一个并发包,适合大部分并发任务,开箱即用,文中的示例代码讲解详细,有需要的小伙伴可以参考下
    2023-10-10

最新评论