当我们去银行存钱的时候,银行会给你一张存款单,这张存款单就是一个模板,把一些公共的内容提取出来,留下部分内容让用户来填写。在软件系统中,将多个类的共有内容提取到一个模板中的思想就是模板方法模式的思想。
模板方法模式就是基于代码复用技术,在模板方法模式中,可以将相同的代码放在父类中,而将不同的方法放在不同的子类中。
在模板方法模式中,需要准备一个抽象类,将部分逻辑以具体方法以及具体构造函数形式实现,然后声明一些抽象方法来让子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法。
定义
定义以一个操作算法中的骨架,将这些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
实例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _9TempaleMethod
{
//测试类
class Program
{
static void Main(string[] args)
{
Spinach sponach = new Spinach("菠菜");
sponach.Way();
Console.WriteLine();
Cabage cabage = new Cabage("大白菜");
cabage.Way();
}
}
//定义抽象类Vegetable
public abstract class Vegetable
{
private string _name;
public Vegetable(string Name):base()
{
this._name = Name;
}
//定义炒蔬菜的一般做法,其中将第三部定义为抽象方法,由具体的子类去实现
public void Way()
{
Console.WriteLine("炒{0}的一般做法:",this._name);
this.Pouroil();
this.Heatoil();
this.pourVegetable();
this.fry();
}
public void Pouroil()
{
Console.WriteLine("倒油");
}
public void Heatoil()
{
Console.WriteLine("把油烧热");
}
public abstract void pourVegetable();
public void fry()
{
Console.WriteLine("翻炒");
}
}
//实现模板方法中的pourVegetable方法
public class Spinach : Vegetable
{
public Spinach(string Name) : base(Name)
{
}
public override void pourVegetable()
{
Console.WriteLine("把菠菜倒进锅里");
}
}
////实现模板方法中的pourVegetable方法
public class Cabage : Vegetable
{
public Cabage(string Name) : base(Name)
{
}
public override void pourVegetable()
{
Console.WriteLine("把大白菜倒进锅里");
}
}
}
/*output:
炒菠菜的一般做法:
倒油
把油烧热
把菠菜倒进锅里
翻炒
炒大白菜的一般做法:
倒油
把油烧热
把大白菜倒进锅里
翻炒
*/