首页 > 其他分享 >15 模版方法模式 -- go语言设计模式

15 模版方法模式 -- go语言设计模式

时间:2023-08-16 22:31:56浏览次数:36  
标签:MakeTea 15 func -- fmt MakeCaffee template Println 设计模式

15 模版方法模式 -- go语言设计模式

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

模版方法模式的实现代码

package main

import "fmt"

//抽象类,制作饮料,包裹一个模板的全部实现步骤
type Beverage interface {
	BoilWater() //煮开水
	Brew()      //冲泡
	PourInCup() //倒入杯中
	AddThings() //添加酌料

	WantAddThings() bool //是否加入酌料Hook
}

//封装一套流程模板,让具体的制作流程继承且实现
type template struct {
	b Beverage
}

//封装的固定模板
func (t *template) MakeBeverage() {
	if t == nil {
		return
	}

	t.b.BoilWater()
	t.b.Brew()
	t.b.PourInCup()

	//子类可以重写该方法来决定是否执行下面动作
	if t.b.WantAddThings() == true {
		t.b.AddThings()
	}
}


//具体的模板子类 制作咖啡
type MakeCaffee struct {
	template  //继承模板
}

func NewMakeCaffee() *MakeCaffee {
	makeCaffe := new(MakeCaffee)
	//b 为Beverage,是MakeCaffee的接口,这里需要给接口赋值,指向具体的子类对象
	//来触发b全部接口方法的多态特性。
	makeCaffe.b = makeCaffe
	return makeCaffe
}

func (mc *MakeCaffee) BoilWater() {
	fmt.Println("将水煮到100摄氏度")
}

func (mc *MakeCaffee) Brew() {
	fmt.Println("用水冲咖啡豆")
}

func (mc *MakeCaffee) PourInCup() {
	fmt.Println("将充好的咖啡倒入陶瓷杯中")
}

func (mc *MakeCaffee) AddThings() {
	fmt.Println("添加牛奶和糖")
}

func (mc *MakeCaffee) WantAddThings() bool {
	return true //启动Hook条件
}

//具体的模板子类 制作茶
type MakeTea struct {
	template  //继承模板
}

func NewMakeTea() *MakeTea {
	makeTea := new(MakeTea)
	//b 为Beverage,是MakeTea,这里需要给接口赋值,指向具体的子类对象
	//来触发b全部接口方法的多态特性。
	makeTea.b = makeTea
	return makeTea
}

func (mt *MakeTea) BoilWater() {
	fmt.Println("将水煮到80摄氏度")
}

func (mt *MakeTea) Brew() {
	fmt.Println("用水冲茶叶")
}

func (mt *MakeTea) PourInCup() {
	fmt.Println("将充好的咖啡倒入茶壶中")
}

func (mt *MakeTea) AddThings() {
	fmt.Println("添加柠檬")
}

func (mt *MakeTea) WantAddThings() bool {
	return false //关闭Hook条件
}

func main() {
	//1. 制作一杯咖啡
	makeCoffee := NewMakeCaffee()
	makeCoffee.MakeBeverage() //调用固定模板方法

	fmt.Println("------------")

	//2. 制作茶
	makeTea := NewMakeTea()
	makeTea.MakeBeverage()
}

终端输出

1.png

模版方法模式的代码拆分

1.项目的准备工作

找到 go 的 GOPATH

$ go env		//可以查看 GOPATH

在 GOPATH 目录下创建3个文件夹

1.bin文件夹		-- 存放编译后的二进制文件

2.pkg文件夹		-- 存放编译后的库文件

3.src文件夹		-- 存放源码文件

2.创建文件夹

//	-- 在项目文件夹 template_mode 里创建新文件夹

//	template	-- 存放装饰者的全部文件

2.png

3.接口文件 -- template文件夹

文件1 -- beverage.go
package template

//抽象类,制作饮料,包裹一个模板的全部实现步骤
type Beverage interface {
	BoilWater() //煮开水
	Brew()      //冲泡
	PourInCup() //倒入杯中
	AddThings() //添加酌料

	WantAddThings() bool //是否加入酌料Hook
}

4.结构体文件 -- template文件夹

文件1 -- template.go
package template

//封装一套流程模板,让具体的制作流程继承且实现
type template struct {
	b Beverage
}

//封装的固定模板
func (t *template) MakeBeverage() {
	if t == nil {
		return
	}

	t.b.BoilWater()
	t.b.Brew()
	t.b.PourInCup()

	//子类可以重写该方法来决定是否执行下面动作
	if t.b.WantAddThings() == true {
		t.b.AddThings()
	}
}
文件2 -- makecaffee.go
package template

import "fmt"

//具体的模板子类 制作咖啡
type MakeCaffee struct {
	template  //继承模板
}

func NewMakeCaffee() *MakeCaffee {
	makeCaffe := new(MakeCaffee)
	//b 为Beverage,是MakeCaffee的接口,这里需要给接口赋值,指向具体的子类对象
	//来触发b全部接口方法的多态特性。
	makeCaffe.b = makeCaffe
	return makeCaffe
}

func (mc *MakeCaffee) BoilWater() {
	fmt.Println("将水煮到100摄氏度")
}

func (mc *MakeCaffee) Brew() {
	fmt.Println("用水冲咖啡豆")
}

func (mc *MakeCaffee) PourInCup() {
	fmt.Println("将充好的咖啡倒入陶瓷杯中")
}

func (mc *MakeCaffee) AddThings() {
	fmt.Println("添加牛奶和糖")
}

func (mc *MakeCaffee) WantAddThings() bool {
	return true //启动Hook条件
}
文件3 -- maketea.go
package template

import "fmt"

//具体的模板子类 制作茶
type MakeTea struct {
	template  //继承模板
}

func NewMakeTea() *MakeTea {
	makeTea := new(MakeTea)
	//b 为Beverage,是MakeTea,这里需要给接口赋值,指向具体的子类对象
	//来触发b全部接口方法的多态特性。
	makeTea.b = makeTea
	return makeTea
}

func (mt *MakeTea) BoilWater() {
	fmt.Println("将水煮到80摄氏度")
}

func (mt *MakeTea) Brew() {
	fmt.Println("用水冲茶叶")
}

func (mt *MakeTea) PourInCup() {
	fmt.Println("将充好的咖啡倒入茶壶中")
}

func (mt *MakeTea) AddThings() {
	fmt.Println("添加柠檬")
}

func (mt *MakeTea) WantAddThings() bool {
	return false //关闭Hook条件
}

5.主文件 -- main.go 在项目文件夹

package main

import (
	"design/template_mode/template"
	"fmt"
)

func main() {
	//1. 制作一杯咖啡
	makeCoffee := template.NewMakeCaffee()
	makeCoffee.MakeBeverage() //调用固定模板方法

	fmt.Println("------------")

	//2. 制作茶
	makeTea := template.NewMakeTea()
	makeTea.MakeBeverage()
}
终端输出

3.png

6.全部文件图

4.png

标签:MakeTea,15,func,--,fmt,MakeCaffee,template,Println,设计模式
From: https://blog.51cto.com/u_14483476/7114503

相关文章

  • 开启Jupyter的远程访问
    环境ubuntu22,JupyternotebookJupyternotebook装到服务器上,每次都跑机房开Jupyternotebook实在不方便,遂开启远程访问步骤安装并配置Jupyter。确保您已经安装了JupyterNotebook或JupyterLab,并且它们已经正确配置。打开终端或命令提示符,并使用以下命令进入Jupyter的配置目......
  • redis的基本命令
    通用命令keyspattern查看符合要求的所有keydel(key)[key...]删除一个指定的keyexists判断key是否存在expire给一个key设置有效期,单位是秒,有效期到时该key会被自动删除(返回-2就是自动删除了)ttl查看一个key的剩余有效期help[命令]查看该命令的用法String类......
  • 原生CSS嵌套简介
    嵌套是使用Sass等CSS预处理器的核心原因之一。现在,该功能已经以类似的语法出现在标准浏览器CSS中。你能否在构建系统时放弃对预处理器的依赖?CSS嵌套可以节省输入时间,并使语法更易于阅读和维护。迄今为止,你必须像这样键入完整的选择器路径:.parent1.child1,.parent2.child1{......
  • 论文解读(ECACL)《ECACL: A Holistic Framework for Semi-Supervised Domain Adaptation
     Note:[wechat:Y466551|付费咨询,非诚勿扰]论文信息论文标题:ECACL:AHolisticFrameworkforSemi-SupervisedDomainAdaptation论文作者:KaiLi,ChangLiu,HandongZhao,YulunZhang,Y.Fu论文来源:2021ICCV论文地址:download 论文代码:download视屏讲解:click1介绍 ......
  • ARC 157 F Sol
    嫌弃讲题人的我,准备好好写一篇题解。linktoproblem观察数据范围:\(1\leN\le50\)。如果是\(20\),想到\(2^{20}\);如果是\(40\),想到\(2^{40\div2}\);若果是\(50\)呢?\(2^{25}\)有点大,于是想到\(2^{50\div3}\)。但是如何去凑?Hint\(N\)\(S\)\(T\)\(res\)\(6......
  • STM32学习记录1:GPIO配置
    GPIO按照ABC进行分组管理,每组GPIO都有自己独立的配置寄存器:GPIOX_CRL/GPIOx_CRH:输入输出模式配置GPIOx_IDR:数据输入GPIOx_ODR:数据输出 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);  //使能PD端口时钟 GPIO_InitTypeDef是GPIO的初始化结构使用IO口:1.使能......
  • 博弈论——机制设计理论(八)
    博弈论(GameTheory)是一种研究人类决策行为的数学方法,用于研究多个参与者之间的交互和策略选择。机制设计(MechanismDesign)则是博弈论的应用,用于构建合理的市场机制或决策规则,旨在引导参与者按照规则进行交互,在最优化的情况下获得稳定的收益。这里将探讨博弈论与机制设计的基本概念及......
  • 致富
    如何迅速致富 简介:本部纪录片将为您讲述如何快速致富。片中主人公大卫·菲斯维克来自英国伯恩利,是个白手起家的千万富翁。他擅长投资,曾交易过汽车,巴士,股票等多种项目。在纪录片中他将与观众分享自己的致富技巧,通过投资项目将本金翻倍的方法,帮助多名与你我一样的普通人实现迅速......
  • 4877: 火柴排队 归并排序
    描述  涵涵有两盒火柴,每盒装有n根火柴,每根火柴都有一个高度。现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为:Σ(ai-bi)^2,i=1~n,其中ai表示第一列火柴中第i个火柴的高度,bi表示第二列火柴中第i个火柴的高度。每列火柴中相邻两根火柴的......
  • 线段树
    线段树\(1.0\)线段树\(1.0\)可以实现对区间内的数加减,查询区间和的操作。例题【模板】线段树1原理定义l,r:分别表示节点表示的区间的左端点与右端点。sum:节点表示的区间\([l,r]\)内数组元素之和。add:lazy标记,表示这个节点以下的所有子节点中的叶子表示的数......