在重构机房的时候卡在了组合查询,所以又重新仔细的研究了一遍模板模式。
在模板模式中,一个抽象类公开定义了执行它的方法的方式。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为模式。
模板模式就是定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定的步骤。
在一些使用通用的方法的时候即可使用。用来解决一些方法通用,却在每一个子类都重写了这一方法。在用的时候只需要将这些通用算法抽象出来。他的关键代码在抽象类中实现,其他的步骤在子类实现。就好像生活中的造房子,地基、走线、水管都一样,只有在建筑的后期才会有房间分布不同的差异。
模板方法的类图:
模板方法模式的代码实现
/// <summary>
/// 抽象类
/// </summary>
public abstract class AbstractClass
{
// 一些抽象行为,放到子类去实现
public abstract void PrimitiveOperation1();
public abstract void PrimitiveOperation2();
/// <summary>
/// 模板方法,给出了逻辑的骨架,而逻辑的组成是一些相应的抽象操作,它们推迟到子类去实现。
/// </summary>
public void TemplateMethod()
{
PrimitiveOperation1();
PrimitiveOperation2();
Console.WriteLine("");
}
}
/// <summary>
/// 具体类,实现了抽象类中的特定步骤
/// </summary>
public class ConcreteClassA : AbstractClass
{
/// <summary>
/// 与ConcreteClassB中的实现逻辑不同
/// </summary>
public override void PrimitiveOperation1()
{
Console.WriteLine("具体类A方法1实现");
}
/// <summary>
/// 与ConcreteClassB中的实现逻辑不同
/// </summary>
public override void PrimitiveOperation2()
{
Console.WriteLine("具体类A方法2实现");
}
}
/// <summary>
/// 具体类,实现了抽象类中的特定步骤
/// </summary>
public class ConcreteClassB : AbstractClass
{
/// <summary>
/// 与ConcreteClassA中的实现逻辑不同
/// </summary>
public override void PrimitiveOperation1()
{
Console.WriteLine("具体类B方法1实现");
}
/// <summary>
/// 与ConcreteClassA中的实现逻辑不同
/// </summary>
public override void PrimitiveOperation2()
{
Console.WriteLine("具体类B方法2实现");
}
}
客户端代码
class Program
{
static void Main(string[] args)
{
// 声明抽象类
AbstractClass c;
// 用ConcreteClassA实例化c
c = new ConcreteClassA();
c.TemplateMethod();
// 用ConcreteClassB实例化c
c = new ConcreteClassB();
c.TemplateMethod();
Console.Read();
}
}
使用模板模式的优缺点
优点:1.封装不变部分,扩展可变部分。
2.提取公共代码,便于维护。
3.行为由父类控制,子类实现。
缺点:每一个不同的实现都需要一个子类来实现,导致累的数量增加,使系统变得庞大。
总结:它适合用在有多个子类共有的方法,且逻辑相同的场景中。一些重要的复杂的方法可以考虑使用模板方法。在一些特用的场景他可以省去很多麻烦的重复问题,但是有优点就有缺点,有利就有弊,所以我们在使用的时候一定要考虑的全面一些,慎重的选择设计模式。