模板方法模式
一、定义
定义一个操作中的算法的框架,而将一些步骤延迟到了子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些步骤。
二、实例
来一个经典的脑筋急转弯。
- 把一个大象装进冰箱要几个步骤?
- 然后把一个长颈鹿装进冰箱要几个步骤?
三、UML类图
四、钩子函数
钩子就是给子类一个授权,让子类来可重定义模板方法的某些步骤,说白了就是虚函数。
五、优缺点
优点
- 封装了算法骨架,提高了代码复用性,简化了使用难度;
- 封装不变部分,扩展可变部分,满足开闭原则。
缺点
- 算法骨架不易更改;
- 扩展时,可能会产生很多子类。
六、代码
1.AnimalToFridge.cs
public abstract class AnimalToFridge { public void Do() { OpenFridge(); BeforePutIntoFridge(); PutIntoFridge(); CloseFridge(); } private void OpenFridge() { Console.WriteLine("把冰箱门打开"); } protected virtual void BeforePutIntoFridge() { } protected abstract void PutIntoFridge(); private void CloseFridge() { Console.WriteLine("把冰箱门关上"); } }
2.ElephantToFridge.cs
public class ElephantToFridge : AnimalToFridge { protected override void PutIntoFridge() { Console.WriteLine("把大象放进去"); } }
3.GiraffeToFridge.cs
public class GiraffeToFridge : AnimalToFridge { protected override void BeforePutIntoFridge() { Console.WriteLine("把大象弄出来"); } protected override void PutIntoFridge() { Console.WriteLine("把长颈鹿放进去"); } }
4.Program.cs
internal class Program { static void Main(string[] args) { AnimalToFridge elephant = new ElephantToFridge(); elephant.Do(); Console.WriteLine("--------------"); AnimalToFridge giraffe = new GiraffeToFridge(); giraffe.Do(); } }
运行结果: