模板方法模式定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。通常用于应对在开发中设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的实现与具体的环境相关。
例如我们在炒菜的时候,炒菜的步骤是固定的,分为倒油、热油、倒菜、倒调料品、翻炒等步骤。现通过模板方法模式来用代码模拟
在以下抽象类中,有具体的实现方法,如倒油、热油、翻炒,因为这些步骤是我们已知的,不管炒什么菜都需要经历这个步骤,但是炒的菜不一样我们倒的蔬菜就不一样,加的调料也不一样,因此把这一部分声明为抽象方法,在子类中再去实现。最后在cookProcess中按照顺序调用类中的方法。
- public abstract class AbstractClass
- {
- //第一步倒油,直接实现
- public void pourOil()
- {
- Console.WriteLine("倒油");
- }
-
- //第二步:热油是一样的,直接实现
- public void heatOil()
- {
- Console.WriteLine("热油");
- }
-
- //第三步:倒蔬菜
- public abstract void pourVegetable();
-
- //第四步:倒调味料是不一样
- public abstract void pourSauce();
-
- //第五步:翻炒是一样的,所以直接实现
- public void fry()
- {
- Console.WriteLine("炒啊炒啊炒到熟啊");
- }
-
- public void cookProcess()
- {
- //第一步:倒油
- this.pourOil();
- //第二步:热油
- this.heatOil();
- //第三步:倒蔬菜
- this.pourVegetable();
- //第四步:倒调味料
- this.pourSauce();
- //第五步:翻炒
- this.fry();
- }
- }
炒辣包菜,实现抽象类中关于菜和配料的抽象方法。
- public class ConcreteClass_BaoCai : AbstractClass
- {
- public override void pourVegetable()
- {
- Console.WriteLine("下包菜");
- }
-
- public override void pourSauce()
- {
- Console.WriteLine("下辣椒");
- }
- }
🐳同上
- public class ConcreteClass_CaiXin : AbstractClass
- {
- public override void pourVegetable()
- {
- Console.WriteLine("下菜心");
- }
-
- public override void pourSauce()
- {
- Console.WriteLine("下蒜蓉");
- }
- }
- class MyClass
- {
- public static void Main(string[] args)
- {
- var concreteClassBaoCai = new ConcreteClass_BaoCai();
- concreteClassBaoCai.cookProcess();
- Console.WriteLine("---------------------");
- var concreteClassCaiXin = new ConcreteClass_CaiXin();
- concreteClassCaiXin.cookProcess();
- }
- }
运行结果!