第一种实现:抽象类
/// <summary>
/// 第一种实现:抽象类
/// </summary>
public abstract class MakeFood
{
public void Make()
{
PourOil();
WaitOilHot();
PourFood();
StartPot();
}
public void PourOil()
{
Console.WriteLine("炒菜第一步:倒油");
}
public void WaitOilHot()
{
Console.WriteLine("炒菜第二步:等油热");
}
/// <summary>
/// 具体往锅里倒哪个菜,交给子类,子类必须实现
/// </summary>
public abstract void PourFood();
public void StartPot()
{
Console.WriteLine("最后一步:等菜热了,起锅");
}
}
/// <summary>
/// 炒土豆
/// </summary>
public class MakePatato : MakeFood
{
public override void PourFood()
{
Console.WriteLine("将土豆倒入锅中");
}
}
public class MakeChicken : MakeFood
{
public override void PourFood()
{
Console.WriteLine("将鸡肉倒入锅中");
}
}
private static void TestAbstract()
{
MakeFood makePatato = new MakePatato();
makePatato.Make();
MakeFood makeChicken = new MakeChicken();
makeChicken.Make();
}
第二种实现:虚方法
/// <summary>
/// 第二种实现:虚方法(提供默认实现)
/// </summary>
public class MakeFoodNew
{
public void Make()
{
PourOil();
WaitOilHot();
PourFood();
StartPot();
}
public void PourOil()
{
Console.WriteLine("炒菜第一步:倒油");
}
public void WaitOilHot()
{
Console.WriteLine("炒菜第二步:等油热");
}
/// <summary>
/// 具体往锅里倒哪个菜,交给子类,子类必须实现
/// </summary>
public virtual void PourFood()
{
Console.WriteLine("炒菜第三步:将菜倒入锅中");
}
public void StartPot()
{
Console.WriteLine("最后一步:等菜热了,起锅");
}
}
public class MakeChickenNew : MakeFoodNew
{
public override void PourFood()
{
Console.WriteLine("重写父类方法:将鸡肉倒入锅中");
}
}
public class MakePatatoNew : MakeFoodNew
{
//使用默认实现
}
private static void TestVirtual()
{
MakeFoodNew makePatato = new MakePatatoNew();
makePatato.Make();
MakeFoodNew makeChicken = new MakeChickenNew();
makeChicken.Make();
}
测试:
class Program
{
/// <summary>
/// 模板方法模式:
/// 日常生活中我们有很多东西都有规定好的模板,我们只需要在模板的基础上修改下就可以变成我们自己所需要的的东西
/// 比如简历,我们在网上下载个简历模板,然后将自己的信息修改上去,这个就是我们自己的简历了
///
/// 模板方法也是如此:
/// 定义好一个模板骨架(下载简历模板),然后将一些具体的步骤延迟到子类中去实现(修改简历信息)
///
/// 模板方法的模板骨架:
/// 1.可以是抽象类:提供抽象方法,具体子类去实现(简历模板中是空白,你自己去填)
/// 2.可以是虚方法:提供默认实现,子类可以去修改,也可以不修改(简历模板中已经填写了内容,根据需要是否修改)
///
/// 此文中的例子:
/// 我们炒菜时大部分步骤都是相同的,但是有些细节,不同的菜的做法有点不一样,此时就可以使用模板方法模式
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
//第一种实现:抽象类(不提供默认实现)
//TestAbstract();
//第二种实现:虚方法(提供默认实现)
TestVirtual();
Console.WriteLine("End");
Console.ReadKey();
}
private static void TestAbstract()
{
MakeFood makePatato = new MakePatato();
makePatato.Make();
MakeFood makeChicken = new MakeChicken();
makeChicken.Make();
}
private static void TestVirtual()
{
MakeFoodNew makePatato = new MakePatatoNew();
makePatato.Make();
MakeFoodNew makeChicken = new MakeChickenNew();
makeChicken.Make();
}
}