模板方法模式定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。通常用于应对在开发中设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的实现与具体的环境相关。
例如我们在炒菜的时候,炒菜的步骤是固定的,分为倒油、热油、倒菜、倒调料品、翻炒等步骤。现通过模板方法模式来用代码模拟
在以下抽象类中,有具体的实现方法,如倒油、热油、翻炒,因为这些步骤是我们已知的,不管炒什么菜都需要经历这个步骤,但是炒的菜不一样我们倒的蔬菜就不一样,加的调料也不一样,因此把这一部分声明为抽象方法,在子类中再去实现。最后在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();
}
}
运行结果!