前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >设计模式:模版方法模式

设计模式:模版方法模式

作者头像
运维开发王义杰
发布2023-08-16 20:01:23
发布2023-08-16 20:01:23
12700
代码可运行
举报
运行总次数:0
代码可运行

模板方法模式是一种行为设计模式,它在一个方法中定义了一个算法的骨架,并允许子类在不改变算法结构的情况下重定义算法的某些步骤。这个算法的骨架就是所谓的“模板方法”。

模板方法模式主要包含以下组件:

1. 抽象类(Abstract Class):这个类定义了一系列方法,这些方法构成了一个算法的骨架。这些方法可以是抽象的,也可以有默认的实现。在模板方法中,我们可以直接实现一些步骤,也可以将一些步骤的实现留给子类。抽象类通常包含模板方法和一些抽象的步骤方法。

2. 具体类(Concrete Class):这些类继承自抽象类,并实现了抽象类中定义的抽象步骤方法。这些方法的实现可以根据具体类的需要来定制,但是算法的骨架是由抽象类中的模板方法定义的,不能被改变。

这种模式的主要优点是它可以最大化地复用代码,减少系统中的重复代码。此外,它还提供了一个框架,使得算法的结构更加清晰,更容易理解。

然而,模板方法模式也有一些限制。例如,如果子类的行为差异很大,或者算法的不同变体不能被很好地组织到一个清晰的骨架中,那么模板方法模式可能就不太适合使用。此外,模板方法模式可能会导致“过度设计”,特别是如果只有一两个具体类需要实现模板方法,而其他类并不需要。

示例:

代码语言:javascript
代码运行次数:0
复制
package main


import "fmt"


// 定义升级接口和模板方法
type Upgrader interface {
    PreUpgrade()
    PostUpgrade()
    Upgrade()
}


type UpgradeTemplate struct {
    Upgrader
}


func (t *UpgradeTemplate) UpgradeSystem() {
    t.PreUpgrade()  // 共享的步骤
    t.Upgrade()  // 钩子方法,具体实现由子类提供
    t.PostUpgrade()  // 共享的步骤
}


// 实现两种不同的升级方式
type UpgradeA struct {
    UpgradeTemplate
}


func (a *UpgradeA) Upgrade() {
    fmt.Println("Upgrade using method A.")
}


type UpgradeB struct {
    UpgradeTemplate
}


func (b *UpgradeB) Upgrade() {
    fmt.Println("Upgrade using method B.")
}


func (t *UpgradeTemplate) PreUpgrade() {
    fmt.Println("Pre upgrade steps.")
}


func (t *UpgradeTemplate) PostUpgrade() {
    fmt.Println("Post upgrade steps.")
}


func main() {
    upgradeA := &UpgradeA{}
    upgradeA.UpgradeTemplate = UpgradeTemplate{upgradeA}
    upgradeA.UpgradeSystem()


    upgradeB := &UpgradeB{}
    upgradeB.UpgradeTemplate = UpgradeTemplate{upgradeB}
    upgradeB.UpgradeSystem()
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-05-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维开发王义杰 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档