《golang设计模式》第三部分·行为型模式-10-模板方法(Template Method)

文章目录

  • [1. 概述](#1. 概述)
    • [1.1 角色](#1.1 角色)
    • [1.2 类图](#1.2 类图)
  • [2. 代码示例](#2. 代码示例)
    • [2.1 设计](#2.1 设计)
    • [2.2 代码](#2.2 代码)
    • [2.3 类图](#2.3 类图)

1. 概述

模板方法(Template Method)用来定义算法的框架,将算法中的可变步骤定义为抽象方法,指定子类实现或重写。

1.1 角色

  • AbstractClass(抽象类):用来定义算法框架和抽象操作
    • templateMethod()方法:使用final修饰,包含了不可变的算法,不允许子类重定义它。
    • invariantStep()方法,可见性为privat,子类不可见,也不能重定义。
    • variantStep():可见性是protected,允许子类继承和重定义。
  • ConcreteClass(具体实现类):用来实现算法框架中的某些步骤,完成与特定子类相关的功能

1.2 类图

AbstractClass +templateMethod() -invariantStep() #variantStep() ConcreteClass #variantStep()

2. 代码示例

2.1 设计

  • 定义抽象类AbstractClass
    • 定义templateMethod()方法,包含了不可变的算法
    • 定义variantStep()方法,是可以被子类重写的方法
    • 定义invariantStep()方法,是抽象类的私有方法
      • 它应该是子类不可见的,但是go中无法真正实现,我们可以把它放到templateMethod()方法中执行,已达到子类视而不见的效果。
  • 定义具体实现类ConcreteClass
    • 它继承了抽象类AbstractClass
    • 它的方法variantStep()重写了父类的variantStep()方法
    • 它的Execute()是它的执行方法
  • 调用
    • 实例化抽象类abstractClass
    • 实例化具体实现类concreteClass,继承了抽象类abstractClass
    • 执行concreteClassExecute()方法
      • 它执行了concreteClass继承的templateMethod()方法
      • 它执行了重写的variantStep()方法
    • 打印测试结果

2.2 代码

  • 代码
go 复制代码
package main

import "fmt"

// 定义抽象类
type AbstractClass struct {
	A int64
	B int64
	C int64
}

// 不可重写的方法,由于golang中没有这种权限控制,我们只能人为规定不在子类中重写。
func (a *AbstractClass) templateMethod() {
	a.A = a.A + 10
	a.invariantStep()
}

// 可重写的方法
func (a *AbstractClass) variantStep() {
	a.B = a.B + 10
}

// 本来是java中私有方法,子类不可见。由于golang中没有这些权限设置,我们只能人为规定不能由其他类调用,因此我们把它放到不可重写方法templateMethod()中执行
func (a *AbstractClass) invariantStep() {
	a.C = a.C + 10
}

func (a *AbstractClass) Get() {
	fmt.Printf("%+v", a)
}

// 具体实现类
type ConcreteClass struct {
	*AbstractClass
}

// 重写父类的variantStep方法
func (c *ConcreteClass) variantStep() {
	c.B = c.B - 10
}

// 定义具体实现类的执行方法
func (c *ConcreteClass) Execute() {
	c.templateMethod()
	c.variantStep()
}

func main() {
	//实例化抽象类
	abstractClass := &AbstractClass{
		A: 1,
		B: 1,
		C: 1,
	}
	//实例化具体实现类
	concreteClass := &ConcreteClass{
		AbstractClass: abstractClass,
	}
	//执行具体实现类的执行方法
	concreteClass.Execute()
	//查看结果
	concreteClass.Get()
}
  • 输出
shell 复制代码
&{A:11 B:-9 C:11}

2.3 类图

AbstractClass +Int A +Int B +templateMethod() -invariantStep() #variantStep() +Get() ConcreteClass #variantStep() +Execute()


相关推荐
恣艺16 小时前
用Go从零实现一个高性能KV存储引擎:B+Tree索引、WAL持久化、LRU缓存的工程实践
开发语言·数据库·redis·缓存·golang
多加点辣也没关系1 天前
设计模式-解释器模式
设计模式·解释器模式
Asurplus1 天前
23中设计模式
设计模式·创建型·结构型·行为型
geovindu1 天前
go: Semaphore Pattern
开发语言·后端·设计模式·golang·企业级信号量模式
dusk_star1 天前
go语言--笔记--封装、组合(继承)
笔记·golang
姚不倒1 天前
Go 语言基础入门:从零到实战,一篇文章掌握核心语法
云原生·golang
写了20年代码的老程序员1 天前
写了 20 年 Java,我发现 90% 的 if-null 和 try-catch 其实是因为缺了一条原则
设计模式·ai编程
XMYX-01 天前
33 - Go 文本模板 template:从入门到原理深挖
golang·正则表达式
货拉拉技术2 天前
私域转化率翻倍的秘密:我们把多模态Agent融进了私域营销
人工智能·算法·设计模式
看山是山_Lau2 天前
抽象工厂模式:一整套对象族如何统一创建?
设计模式·抽象工厂模式