定义:模板方法模式(TemplateMethod Pattern),定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模块方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
类型:类行为型模式
概述:
模板方法模式应该算是所有设计模式中最简单,却也是应用得最多的模式了。模板方法模式其实就是多态的体现。
模板方法模式设计的要点是在父类中定义好一个操作中的算法骨架,然后具体实现延迟到子类中。模板方法其实与策略模式有一些类似的地方。不同点是,策略模式将算法抽象出来成为一个新的类,而模板方法则没有将算法抽象出来。主要体现是策略模式的算法相对复杂一点,而模板方法的算法相对简单一点。
举例,有一群人,可以按身高排序然后取其中高的一部分;也可以体量排序然后取其中体量适宜的一部分。
类图:
参与者:
- People,基类,提供一个模板方法,并且提供抽象的接口。模板方法调用接口完成具体的算法。
- HighPeople、FatPeople,根据想要完成的情况,来具体实现抽象接口。
示例代码:
- using System;
- using System.Collections.Generic;
- using System.Text;
- namespace Pattern23
- {
- abstract class People
- {
- public abstract void Sort();
- public abstract void Remove();
- public void TemplateMethod()
- {
- Sort();
- Remove();
- }
- }
- class HighPeople : People
- {
- public override void Sort()
- {
- Console.WriteLine("按身高排序");
- }
- public override void Remove()
- {
- Console.WriteLine("排除掉身高低于170cm的人");
- }
- }
- class FatPeople : People
- {
- public override void Sort()
- {
- Console.WriteLine("按体重排序");
- }
- public override void Remove()
- {
- Console.WriteLine("排除体量超过80K以及少于60KG的人");
- }
- }
- class Program
- {
- static void Main(string[] args)
- {
- People people;
- people = new HighPeople();
- people.TemplateMethod();
- people = new FatPeople();
- people.TemplateMethod();
- }
- }
- }
适用性:
- 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
- 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。
首先识别现有代码中的不同之处,并且将不同之处分离为新的操作。
最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。 - 控制子类扩展。
优缺点:
- 优点,完成新的模板方法是不用修改原有代码,通过添加新代码完成。
参考资料:
- 《设计模式——可复用面向对象软件基础》
- 《大话设计模式》