设计模式——模板方法模式

模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类在不改变算法结构的情况下,重新定义算法中的某些步骤。(模板方法将算法定义成一组步骤,其中任何步骤都可以是抽象的,由子类负责实现。)

工厂方法是模板方法的一种特殊版本。

钩子:在当前类不做事或实现默认方法,但子类中可以选择实现或者不实现该方法。下面的go模板方法模式中,没办法实现钩子。

钩子目的:1.算法部分可选;2.让子类能够有机会对模板方法中某些即将发生(或刚刚发生)的步骤做出反应。总的来说,钩子让子类有能力为其抽象类作一些决定。

package main

import "fmt"

//抽象,不同步骤
type makeBeverage interface{
	brew()
	addCondiments()
}

type Beverage struct{
	makeBeverage
}
//模板方法
func (b Beverage) prepareRecipe(){
	b.boilWater()
	b.makeBeverage.brew()
	b.pourInCup()
	b.makeBeverage.addCondiments()
}
//相同步骤
func (b Beverage) boilWater(){
	fmt.Println("boilWater")
}
func (b Beverage) pourInCup(){
	fmt.Println("pourInCup")
}
//做茶
type Tea struct{
	Beverage
}
func (t Tea) brew(){
	fmt.Println("pao cha")
}
func (t Tea) addCondiments(){
	fmt.Println("sweet")
}
//做咖啡
type Coffee struct{
	Beverage
}
func (c Coffee) brew(){
	fmt.Println("pao coffee")
}
func (c Coffee) addCondiments(){
	fmt.Println("sugar and milk")
}

func main () {
	b := Beverage{}
	b.makeBeverage = Tea{}
	b.prepareRecipe()
	b.makeBeverage = Coffee{}
	b.prepareRecipe()
	fmt.Println("hello https://tool.lu/")
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值