TemplateMethodPattern-模板方法模式

ZHIZRL / 2023-08-22 / 原文

在C#中,模板方法模式(Template Method Pattern)是一种行为型设计模式,它定义了一个算法的骨架,将某些步骤延迟到子类中实现。模板方法模式通过将公共的算法步骤抽象到基类中,并且通过在基类中定义一个模板方法来调用这些步骤,从而实现代码的复用和灵活性。

模板方法模式有以下几个关键角色:

AbstractClass(抽象类):定义了一个算法的骨架,将算法的具体步骤抽象到独立的方法中,并在抽象类中定义一个模板方法来调用这些步骤。抽象类可以包含抽象方法、具体方法和钩子方法。

ConcreteClass(具体类):是抽象类的子类,实现了在抽象类中定义的抽象方法,完成具体的算法步骤。

Hook(钩子方法):在抽象类中定义的具体方法,它可以有默认的实现,但通常是空的或只提供基本的实现,并且由具体类来决定是否重写。

下面是一个示例,展示如何在C#中使用模板方法模式来实现一个简单的数据导入系统:

namespace TemplateMethodPattern_模板方法模式
{
    public class TemplateMethod
    {
        // AbstractClass
        public abstract class DataImporter
        {
            public void ImportData()
            {
                OpenFile();
                ParseData();
                ValidateData();
                TransformData();
                SaveData();
                CloseFile();
            }

            protected abstract void OpenFile();
            protected abstract void ParseData();
            protected abstract void ValidateData();
            protected abstract void TransformData();
            protected abstract void SaveData();
            protected abstract void CloseFile();
        }

        // ConcreteClass
        public class ExcelImporter : DataImporter
        {
            protected override void OpenFile()
            {
                Console.WriteLine("Opening Excel file");
                // 实际的打开Excel文件的逻辑
            }
            protected override void ParseData()
            {
                Console.WriteLine("Parsing data from Excel file");
                // 实际的解析Excel数据的逻辑
            }
            protected override void ValidateData()
            {
                Console.WriteLine("Validating Excel data");
                // 实际的验证Excel数据的逻辑
            }
            protected override void TransformData()
            {
                Console.WriteLine("Transforming Excel data");
                // 实际的转换Excel数据的逻辑
            }
            protected override void SaveData()
            {
                Console.WriteLine("Saving transformed Excel data");
                // 实际的保存转换后的Excel数据的逻辑
            }
            protected override void CloseFile()
            {
                Console.WriteLine("Closing Excel file");
                // 实际的关闭Excel文件的逻辑
            }
        }
        public class CsvImporter : DataImporter
        {
            protected override void OpenFile()
            {
                Console.WriteLine("Opening CSV file");
                // 实际的打开CSV文件的逻辑
            }
            protected override void ParseData()
            {
                Console.WriteLine("Parsing data from CSV file");
                // 实际的解析CSV数据的逻辑
            }
            protected override void ValidateData()
            {
                Console.WriteLine("Validating CSV data");
                // 实际的验证CSV数据的逻辑
            }
            protected override void TransformData()
            {
                Console.WriteLine("Transforming CSV data");
                // 实际的转换CSV数据的逻辑
            }
            protected override void SaveData()
            {
                Console.WriteLine("Saving transformed CSV data");
                // 实际的保存转换后的CSV数据的逻辑
            }
            protected override void CloseFile()
            {
                Console.WriteLine("Closing CSV file");
                // 实际的关闭CSV文件的逻辑
            }
        }
    }
}
namespace TemplateMethodPattern_模板方法模式
{
    internal class Program
    {
        static void Main(string[] args)
        {
            DataImporter importer = new ExcelImporter();
            importer.ImportData();

            importer = new CsvImporter();
            importer.ImportData();

            //输出结果
            //Opening Excel file
            //Parsing data from Excel file
            //Validating Excel data
            //Transforming Excel data
            //Saving transformed Excel data
            //Closing Excel file
            //Opening CSV file
            //Parsing data from CSV file
            //Validating CSV data
            //Transforming CSV data
            //Saving transformed CSV data
            //Closing CSV file
            Console.Read();
        }
    }
}

通过使用模板方法模式,可以将算法的通用步骤定义在抽象类中,由具体类来实现具体的细节。这样可以实现代码的复用,避免重复的代码编写。同时,模板方法模式还允许子类根据实际情况对算法的某些步骤进行重写或更改,提供了一定的灵活性。