设计模式——模板方法模式封装.net Core读取不同类型的文件

1、模板方法模式

模板方法模式:定义一个操作中的算法骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

特点:通过把不变的行为搬移到超类,去除子类中重复的代码来体现它的优势。

模板方法模式提供了一个很好的代码复用平台。当不变的和可变的行为在子类实现中混合在一起的时候,不变的行为就会在子类中重复出现。我们通过模板方法模式把这些行为搬移到单一的地方,这样就帮助子类摆脱重复的不变的行为的纠缠。

2、Net Core 读取的类型文件

读取不同类型文件的代码

cs 复制代码
 //读取JSON
 ConfigurationBuilder builder = new ConfigurationBuilder();
 builder.AddJsonFile("configuration.json");
 var config = builder.Build();
 var collections = config.AsEnumerable();

 //读取INI
 ConfigurationBuilder builder = new ConfigurationBuilder();
 builder.AddIniFile("configuration.ini");
 var config = builder.Build();
 var collections = config.AsEnumerable();

 //读取XML
 ConfigurationBuilder builder = new ConfigurationBuilder();
 builder.AddXmlFile("configuration.xml");
 var config = builder.Build();
 var collections = config.AsEnumerable();

如上代码:如果不使用模板方法模式,定义读取文件基类,子类中重写读取方法,如下代码

cs 复制代码
 //定义读取文件的基类
 public abstract class AFileRead
 {
     public abstract void Read(string path);
 }

 //定义读取JSON文件的子类
 public class FileReadJson:AFileRead
 {
     public override void Read(string path)
     {
         ConfigurationBuilder builder = new ConfigurationBuilder();
         builder.AddJsonFile(path);
         var config = builder.Build();
         var collections = config.AsEnumerable();
     }
 }

 //定义读取INI文件的子类
public class FileReadIni : AFileRead
{
    public override void Read(string path)
    {
        ConfigurationBuilder builder = new ConfigurationBuilder();
        builder.AddIniFile(path);
        var config = builder.Build();
        var collections = config.AsEnumerable();
    }
}
//定义读取XML文件的子类
 public class FileReadXml:AFileRead
 {
     public override void Read(string path)
     {
         ConfigurationBuilder builder = new ConfigurationBuilder();
         builder.AddXmlFile(path);
         var config = builder.Build();
         var collections = config.AsEnumerable();
     }
 }

上述代码中,只有一行读取不同类型文件代码不同,其余代码都相同。这只是单独的一个读取文件的功能,代码量很小,如果是一个特别大的功能,代码过多,那么如果要更改的话,工作量也是很大的。

为了减少重复的代码,如何去解决这个问题?

这个时候,模板方法模式,就起作用了。模板方法模式将子类中不变的行为定义到基类中,子类中只留下可变的行为,这样子类中就摆脱了重复代码的纠缠,代码如下:

cs 复制代码
//定义读取文件的接口
public interface IFileRead
{
    IEnumerable<KeyValuePair<string,string>> ReadFile();
}

//定义读取文件,封装重复代码,将可变的行为延迟到子类中实现
public abstract class AFileRead : IFileRead
{
    public IEnumerable<KeyValuePair<string, string>> ReadFile()
    {
        ConfigurationBuilder builder = new ConfigurationBuilder();
        AddFile(builder);  
        var config = builder.Build();
        var collections = config.AsEnumerable();
        return collections;
    }
    //这个函数需要延迟到子类中去实现
    protected abstract IConfigurationBuilder AddFile(ConfigurationBuilder builder);
}
//读取JSON文件
public class ReadJsonFile : AFileRead
{
    protected override IConfigurationBuilder AddFile(ConfigurationBuilder builder)
    {
        return builder.AddJsonFile("configuration.json");
    }
}
//读取XML文件
public class ReadXmlFile : AFileRead
{
    protected override IConfigurationBuilder AddFile(ConfigurationBuilder builder)
    {
        return builder.AddXmlFile("configuration.xml");
    }
}
//读取Ini文件
public class ReadIniFile : AFileRead
{
    protected override IConfigurationBuilder AddFile(ConfigurationBuilder builder)
    {
        return builder.AddIniFile("configuration.ini");
    }
}

总结: 模板方法模式,帮助我们封装了不变的行为,涉及到实现某些特定步骤时,就延迟到了子类中去实现,在更改某个读取文件的函数时,不会影响到其他读取文件的功能。

相关推荐
软考真题app11 小时前
软件设计师考试结构型设计模式考点全解析
设计模式·软件设计师·结构型设计模式·考试考点
江沉晚呤时13 小时前
.NET Core 中 Swagger 配置详解:常用配置与实战技巧
前端·.netcore
xiaolin033316 小时前
【设计模式】- 行为型模式1
设计模式·状态模式·责任链模式·策略模式·命令模式·模板方法模式·行为型模式
矿工学编程17 小时前
.NET Core liunx二进制文件安装
.netcore
沐土Arvin17 小时前
深入理解 requestIdleCallback:浏览器空闲时段的性能优化利器
开发语言·前端·javascript·设计模式·html
bao_lanlan18 小时前
兰亭妙微:用系统化思维重构智能座舱 UI 体验
ui·设计模式·信息可视化·人机交互·交互·ux·外观模式
总是难免19 小时前
设计模式 - 单例模式 - Tips
java·单例模式·设计模式
Java致死1 天前
设计模式Java
java·开发语言·设计模式
ghost1431 天前
C#学习第23天:面向对象设计模式
开发语言·学习·设计模式·c#
敲代码的 蜡笔小新2 天前
【行为型之迭代器模式】游戏开发实战——Unity高效集合遍历与场景管理的架构精髓
unity·设计模式·c#·迭代器模式