golang实现设计模式之模板模式-优缺点,适用场景

发布时间 2023-06-09 18:22:40作者: 进击的davis

模板模式是一种行为型设计模式,其定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

特点

  • 1.算法结构已确定。
  • 2.具体实现交由子类实现。

结构

  • 1.抽象类(Abstract Class)。算法步骤可以被声明为抽象类型, 也可以提供一些默认实现。
  • 2.具体类(Concrete Class)。可以重写所有步骤, 但不能重写模板方法自身。

优缺点

  • 优点

1.复用。所有的子类可以复用父类中提供的模板方法的代码。
2.扩展。框架通过模板模式提供功能扩展点,基于扩展点进行扩展而不用修改源码。
3.行为父类控制,子类实现。

  • 缺点

1.每一个不同的实例,都需要一个子类来实现,导致类的个数增加。
2.算法发生变化,需要修改所有的类。

适用场景

  • 1.只希望客户端扩展某个特定算法步骤,而不是整个算法或其结构。
  • 2.当多个类的算法除一些细微不同之外几乎完全一样时,可使用该模式。但其后果就是,只要算法发生变化,就可能需要修改所有的类。

代码实现

package main

import "fmt"

// 1.abstract interface, define method
type iWork interface {
   getup()
   work()
   sleep()
}

// 2.org
type RoleCoder struct {
}

func (r *RoleCoder) getup() {
   fmt.Println("coder getup.")
}

func (r *RoleCoder) work() {
   fmt.Println("coder work.")
}

func (r *RoleCoder) sleep() {
   fmt.Println("coder sleep.")
}

// 3.concrete template
type Worker1 struct {
   iWork
}

func NewWork1(w iWork) *Worker1 {
   return &Worker1{w}
}

// implement concrete method
func (w *Worker1) Daily() {
   w.getup()
   w.work()
   w.sleep()
}

// client
func main() {
   worker := NewWork1(&RoleCoder{})
   worker.Daily()
}

参考文章: