设计模式之 Template Method模版方法

发布时间 2023-10-08 14:36:40作者: 张德长

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}");
        }


    }