设计模式 <行为型> | 模版模式

模版模式(Template Method)

模板方法模式在一个方法中定义一个算法骨架,并将某些步骤推迟到子类中实现。模板方法模式可以让子类在不改变算法整体结构的情况下,重新定义算法中的某些步骤。

算法可以理解为业务逻辑,并不特指数据结构和算法中的算法。这里的算法骨架就是模板,包含算法骨架的方法就是模板方法,这也是模板方法模式名字的由来。

结构图:

角色:

  1. 抽象类(AbstractClass): 定义模版算法,以及依次调用它们的实际模板方法。 算法步骤可以被声明为抽象类型,也可以提供一些默认实现。
  2. 具体类(Concrete­Class):可以重写所有步骤, 但不能重写模板方法。

适用场景:

  1. 需要根据环境来决定执行业务时。

优点:

  1. 把算法可变的各个部分分发到子类中,提高了算法的扩展性。
  2. 把算法不算的部分放在基类中,符合开闭原则。

缺点:

  1. 如果基类修改所有子类都需要修改。

代码(C#)

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54

/// <summary>
/// 抽象类
/// </summary>
public abstract class AbstractClass
{
public void TemplateMethod()
{
Method1();
Method2();
// 可变的抽离出去
Console.WriteLine("TemplateMethod");
}

protected abstract void Method1();
protected abstract void Method2();
}

/// <summary>
/// 具体类
/// </summary>
public class ConcreteClass1 : AbstractClass
{
protected override void Method1()
{
Console.WriteLine("ConcreteClass1 Method1");
}

protected override void Method2()
{
Console.WriteLine("ConcreteClass1 Method2");
}
}

/// <summary>
/// 具体
/// </summary>
public class ConcreteClass2 : AbstractClass
{
protected override void Method1()
{
Console.WriteLine("ConcreteClass2 Method1");
}

protected override void Method2()
{
Console.WriteLine("ConcreteClass2 Method2");
}
}

AbstractClass a = new ConcreteClass2();
a.TemplateMethod();


最后

模板模式有两大作用,复用和扩展。其中,复用指的是,所有的子类可以复用父类中提供的模板方法的代码。扩展指的是,框架通过模板模式提供功能扩展点,让框架用户可以在不修改框架源码的情况下,基于扩展点定制化框架的功能。

同步回调跟模板模式几乎一致。它们都是在一个大的算法骨架中,自由替换其中的某个步骤,起到代码复用和扩展的目的。而异步回调跟模板模式有较大差别,更像是观察者模式。

回调基于组合关系来实现,把一个对象传递给另一个对象,是一种对象之间的关系,模板模式基于继承关系来实现,子类重写父类的抽象方法,是一种类之间的关系。


设计模式 <行为型> | 模版模式
http://example.com/posts/37900.html
作者
她微笑的脸y
发布于
2023年3月7日
许可协议