一、定义
在一个抽象类中定义一个操作中的算法骨架(对应于生活中的大家下载的模板),而将一些步骤延迟到子类中去实现(对应于我们根据自己的情况向模板填充内容)。模板方法使得子类可以不改变一个算法的结构前提下,重新定义算法的某些特定步骤,模板方法模式把不变行为搬到超类中,从而去除了子类中的重复代码。
二、结构图
三、示例
//抽象模板角色(Vegetable扮演这个角色):定义了一个或多个抽象操作,以便让子类实现,这些抽象操作称为基本操作。
public abstract class TestPaper
{
public void Question1( )
{
Console.WriteLine( "What's your name?" );
Console.WriteLine( "answer: " + GetName() );
}
public void Question2( )
{
Console.WriteLine( "What's your job?" );
Console.WriteLine( "answer: " + GetJob( ) );
}
public virtual string GetName( )
{
return "";
}
public abstract string GetJob( );
}
//具体模板角色(ChineseCabbage和Spinach扮演这个角色):实现父类所定义的一个或多个抽象方法。
class TestPaperA : TestPaper
{
public override string GetName( )
{
return "A";
}
public override string GetJob( )
{
return "Doctor";
}
}
class TestPaperB : TestPaper
{
public override string GetName( )
{
return "B";
}
public override string GetJob( )
{
return "Teacher";
}
}
static void Main( string[ ] args )
{
TestPaperA a = new TestPaperA( );
a.Question1( );
a.Question2( );
TestPaperB b = new TestPaperB( );
b.Question1( );
b.Question2( );
Console.Read( );
}
运行结果:
模板方法模式在抽象类中定义了算法的实现步骤,将这些步骤的实现延迟到具体子类中去实现,从而使所有子类复用了父类的代码,所以模板方法模式是基于继承的一种实现代码复用的技术。
四、模板方法模式的优缺点
优点:
- 实现了代码复用
- 能够灵活应对子步骤的变化,符合开放-封闭原则
缺点:
因为引入了一个抽象类,如果具体实现过多的话,需要用户或开发人员需要花更多的时间去理清类之间的关系。