设计模式之模板模式

miloyang
0 评论
/ /
420 阅读
/
1861 字
22 2023-11

简介

模板模式是一种行为型设计模式,它定义了一个实现模板的骨架,将一些步骤推迟到子类,模板模式使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

模板模式涉及到一下几个角色:

  • 模板类 AbstractClass

    定义一个骨架,其中包含了一系列的步骤,这些步骤可以包含抽象方法、具体方法以及钩子方法等等。

  • 具体模板类 ConcreteClass

    实现了模板类的抽象方法,完成算法中特定步骤的具体实现,具体模版类也可以覆盖钩子方法

jugelizi

一辆车,开车的步骤是什么?开门、点火、起步,但是有的人可能还需要听歌,那么开音乐就放在钩子放里面,根据自己的喜爱来。

Demo

// AbstractDrive 模板类
type AbstractDrive interface {
    OpenDoor()
    Fire()
    Going()
    Hook()
}

type Driver struct {
    AbstractDrive
}

func NewDriver(abstract AbstractDrive) *Driver {
    return &Driver{
        abstract,
    }
}

func (d *Driver) Template() {
    d.OpenDoor()
    d.Fire()
    d.Going()
    d.Hook()
}

// CommonTemplate 具体模板类
type CommonTemplate struct {
}

func (d *CommonTemplate) OpenDoor() {
    fmt.Println("开门")
}

func (d *CommonTemplate) Fire() {
    fmt.Println("点火")
}

func (d *CommonTemplate) Going() {
    fmt.Println("起步")
}

// Hook 钩子方法,子类可以选择性地覆盖
func (d *CommonTemplate) Hook() {
    fmt.Println("开启音乐")
}

测试

func TestTemplate(t *testing.T) {
    commonDriver := NewDriver(&CommonTemplate{})
    commonDriver.Template()
}

CommonTemplate我们定义了通用的实现模板类,也定义了一个默认的司机Driver,如果你希望在开门就播放音乐,那么你可以定一个DIYDriver,在你的Template去更换顺序。 在具体模板类中,我们可以选择性地覆盖钩子方法,以实现一些特定的行为。

作用和场景

  • 定义实现模式骨架

    模板模式主要就是定一个骨架,然后你具体如何实现则放到子类中、

  • 封装通用行为

    将算法中的通用行为放在模板类中,可以确保这些通用行为在整个算法中保持一致,避免了重复的代码。

  • 子类扩展 子类可以选择性地覆盖或扩展模板类中的方法,从而实现特定步骤的定制。

板模式适用于多个子类有相同的算法结构,但其中某些步骤的具体实现可能不同的情况。或者是一些状态机中的状态流程图等等,为每个状态扭转都定义不同的模板,然后根据模板走。

人未眠
工作数十年
脚步未曾歇,学习未曾停
乍回首
路程虽丰富,知识未记录
   借此博客,与之共进步