计划模式 22 模板方法模式

[复制链接]
发表于 2026-1-22 08:31:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
计划模式 22



  • 创建型模式(5):工厂方法模式、抽象工厂模式、单例模式、制作者模式、原型模式
  • 结构型模式(7):适配器模式、桥接模式、组合模式、装饰者模式、外貌模式、享元模式、署理模式
  • 运动型模式(11):责任链模式、下令模式、表明器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、战略模式、模板方法模式、访问者模式


模板方法模式(Template Method Pattern)

1 界说

模板方法模式通过在基类中界说一个模板方法,该方法封装了一个算法的固定步调,然后答应子类实现或重写这些步调。如许,子类可以定制算法的具体运动,而无需改变算法的团体结构。
2 结构

模板方法模式包罗以下脚色:


  • 抽象类(AbstractClass): 界说模板方法和算法的骨架。模板方法按照固定的步调调用抽象方法或具体方法。
  • 具体类(ConcreteClass): 继续自抽象类,实现或重写抽象方法,界说算法的具体步调。
UML 类图
  1. +---------------------------+     
  2. |  AbstractClass            |     
  3. +---------------------------+     
  4. | + TemplateMethod(): void  |     
  5. | + Step1(): void           |     
  6. | + Step2(): void           |     
  7. | - Step3(): void           |     
  8. +---------------------------+     
  9.         ^     
  10.         |     
  11. +-------------------+     
  12. |  ConcreteClass    |     
  13. +-------------------+     
  14. | - Step3(): void   |     
  15. +-------------------+
复制代码
3 示例代码

假设我们要制作一杯饮料,制作的过程包罗煮水、冲泡、倒入杯中、添加配料等步调。咖啡和茶是两种差别的饮料,它们在制作过程中的步调根本雷同,但在某些步调上有所差别。我们可以利用模板方法模式来实现这个场景。
抽象类
  1. // 抽象类 - 饮料制作过程
  2. public abstract class Beverage
  3. {
  4.     // 模板方法
  5.     public void PrepareRecipe()
  6.     {
  7.         BoilWater();
  8.         Brew();
  9.         PourInCup();
  10.         AddCondiments();
  11.     }
  12.     // 具体方法 - 煮水
  13.     private void BoilWater()
  14.     {
  15.         Console.WriteLine("Boiling water");
  16.     }
  17.     // 抽象方法 - 冲泡
  18.     protected abstract void Brew();
  19.     // 具体方法 - 倒入杯中
  20.     private void PourInCup()
  21.     {
  22.         Console.WriteLine("Pouring into cup");
  23.     }
  24.     // 抽象方法 - 添加配料
  25.     protected abstract void AddCondiments();
  26. }
复制代码
具体类
  1. // 具体类 - 茶
  2. public class Tea : Beverage
  3. {
  4.     protected override void Brew()
  5.     {
  6.         Console.WriteLine("Steeping the tea");
  7.     }
  8.     protected override void AddCondiments()
  9.     {
  10.         Console.WriteLine("Adding lemon");
  11.     }
  12. }
  13. // 具体类 - 咖啡
  14. public class Coffee : Beverage
  15. {
  16.     protected override void Brew()
  17.     {
  18.         Console.WriteLine("Dripping coffee through filter");
  19.     }
  20.     protected override void AddCondiments()
  21.     {
  22.         Console.WriteLine("Adding sugar and milk");
  23.     }
  24. }
复制代码
客户端代码
  1. class Program
  2. {
  3.     static void Main(string[] args)
  4.     {
  5.         Beverage tea = new Tea();
  6.         tea.PrepareRecipe();  // 制作茶
  7.         Console.WriteLine();
  8.         Beverage coffee = new Coffee();
  9.         coffee.PrepareRecipe();  // 制作咖啡
  10.     }
  11. }
复制代码
运行效果
  1. Boiling water
  2. Steeping the tea
  3. Pouring into cup
  4. Adding lemon
  5. Boiling water
  6. Dripping coffee through filter
  7. Pouring into cup
  8. Adding sugar and milk
复制代码
在这个例子中,Beverage 是抽象类,界说了一个模板方法 PrepareRecipe(),它包罗了制作饮料的固定步调。这些步调中,有些是具体实现的(如 BoilWater() 和 PourInCup()),而有些是抽象方法,由子类 Tea 和 Coffee 来实现(如 Brew() 和 AddCondiments())。客户端代码可以利用差别的具体类来制作差别的饮料,而不必要关心具体的实现细节。
4 特点



  • 长处:

    • 代码复用: 将通用的算法步调封装到基类中,子类只必要实现差异化的部门,淘汰了重复代码。
    • 扩展性强: 子类可以根据必要重写或扩展某些步调,增长算法的机动性。
    • 控制算法结构: 父类界说了算法的骨架,确保了算法的团体结构不被子类粉碎。

  • 缺点:

    • 增长代码复杂性: 由于引入了继续关系和抽象方法,大概会使代码结构变得复杂。
    • 对子类的依靠: 父类依靠子类来实现某些步调,大概导致子类必须实现某些方法,纵然这些方法在特定环境下并不必要。

5 实用场景



  • 多个类有相似的利用步调: 当多个类的利用步调大抵雷同时,可以利用模板方法模式将雷同的部门提取到抽象类中。
  • 算法必要多个步调: 当算法必要分解为多个步调,而且这些步调中有些是固定的,有些是可变的,可以利用模板方法模式。
  • 控制算法的流程: 当必要确保算法的某些步调必须按照肯定的序次实行时,可以利用模板方法模式。
6 总结

模板方法模式通过将通用的算法步调封装到抽象类中,答应子类重写或扩展特定的步调,实现了算法的复用和扩展。它确保了算法的团体结构不被粉碎,同时为子类提供了机动性。在多个类具有相似的利用步调时,模板方法模式是一种非常有效的计划模式。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表