设计模式之 Template Method模版方法
Template Method模式提供了不重写方法的前提下,允许子类重载部分方法的方法;
在操作中定义算法的框架,将一些步骤由子类实现,该模式可以再不修改算法结构的情况下,让子类重新定义算法的特定步骤;
优点:
代码重用的基础技术;
适用:
想要一次实现算法的不变部分,而使用子类实现算法的可变行为;
当子类间的通用行为需要分解、定位到通用类的时候,这样可以避免代码重复的问题;
示例代码C#:
/// <summary>
/// 基类(抽象类,允许子类重写可变部分)
/// </summary>
public abstract class BaseSquare
{
/// <summary>
/// 求平方,不变部分
/// </summary>
/// <param name="x"></param>
/// <returns></returns>
public int Square(int x)
{
return x * x;
}
/// <summary>
/// 求和或求差,是可变部分(在子类中重写)
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns></returns>
public abstract int DynamicCal(int x, int y);
/// <summary>
/// 计算最终结果
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns></returns>
public int GetResult(int x, int y)
{
int temp = DynamicCal(x,y);
return Square(temp);
}
}
/// <summary>
/// 平方和
/// </summary>
public class SumSquare : BaseSquare
{
/// <summary>
/// 将可变部分重写
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns></returns>
public override int DynamicCal(int x, int y)
{
return x+y;
}
}
/// <summary>
/// 平方差
/// </summary>
public class SubSquare : BaseSquare
{
/// <summary>
/// 将可变部分重写
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns></returns>
public override int DynamicCal(int x, int y)
{
return x-y;
}
}
class Program
{
static void Main(string[] args)
{
TemplateMethodTest();
Console.ReadLine();
}
public static void TemplateMethodTest()
{
int a = 2, b = 4, res;
res = new SumSquare().GetResult(a, b);
Console.WriteLine($"{a},{b}的平方和是{res}");
res = new SubSquare().GetResult(a, b);
Console.WriteLine($"{a},{b}的平方差是{res}");
}
}