模板方法模式

# 分类

行为型模式

# 定义

模板方法模式(TemplateMethond Pattern) 在模板模式中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。

# 意图

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

# 应用场景

  • 有多个子类共有的方法,且逻辑相同。
  • 重要的、复杂的方法、可以考虑作为模板方法。

应用案例

  • 在造房子的时候。地基、走线、水管都一样,只有在建筑的后期才有加壁厨加珊栏等差异
  • 西游记里菩萨定好的81难,这就是一个顶层逻辑骨架。

# 角色与结构图

  • AbstractClass:抽象类角色 其实就是一个抽象模板,定义并实现了一个模板方法。这个模板方法一般是一个具体方法,它给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。具体子类将重定义PrimitiveOperation以实现一个算法的步骤。
  • ConcreteClass:具体类角色 实现父类所定义个的一个或者多个抽象方法,每一个AbstractClass都可以有任意多个ConcreteClass与之对应,而每个ConcreteClass都可以给出这些抽象方法的不同实现,从而使得顶级逻辑的实现各不相同。
  • Client:客户端角色 使用模板类实现功能。

下图解释了模板方法模式中各角色的作用

<<------------------------模板方法结构图--------------------------->>

# 示例代码

// 抽象类,定义了相关的抽象方法
abstract class AbstractClass{
  public abstract void PrimitiveOperation1();
  public abstract void PrimitiveOperation2();

  public void TemplateMethod(){
    PrimitiveOperation1();
    PrimitiveOperation2();
    Console.WriteLine("");
  }
}
// 具体类A
class ConcreteClassA{
  public override void PrimitiveOperation1(){
    Console.WriteLine("具体类A方法1的实现");
  }

  public override void PrimitiveOperation2(){
    Console.WriteLine("具体类A方法2的实现");
  }
}
// 具体类B
class ConcreteClassB{
  public override void PrimitiveOperation1(){
    Console.WriteLine("具体类B方法1的实现");
  }

  public override void PrimitiveOperation2(){
    Console.WriteLine("具体类B方法2的实现");
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//客户端
class Client{
  static void Main(string[] args){
     AbstractClass a ;
     a = new ConcreteClassA();
     a.TemplateMethod();

     a = new ConcreteClassB();
     a.TemplateMethod();
     Console.Readline();
  }
}
1
2
3
4
5
6
7
8
9
10
11
12

# 优点

  • 封装不变部分,扩展可变部分。
  • 提取公共代码,便于维护。
  • 行为由父类控制,子类实现。

# 缺点

  • 每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。

# 小结

  • 模板方法模式是通过把不变行为搬移到超类,去除子类中重复的代码来体现它的优势。
  • 模板方法模式就是提供了一个很好的代码复用平台。
  • 当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现,我们通过模板方法把这些行为搬移到单一的地方,这样就帮助子类摆脱重复的不变行为的纠缠。
  • 主要解决?一些方法通用,却在每一个子类都重写这个方法。
  • 何时使用?有一些通用的方法。
  • 关键代码?在抽象类实现,其他步骤在子类实现。
  • 注意:为防止恶意操作,一般模板方法都加上final关键字。

# 一句话概括

定义一个算法结构,而将一些步骤延迟到子类实现。

上次更新: 2025/03/22, 13:47:44
最近更新
01
Git问题集合
01-29
02
安装 Nginx 服务器
01-25
03
安装 Docker 容器
01-25
更多文章>
×
×