Net设计模式实例之模板方法模式(Template Mothed Pattern)

简介: 一、模板方法模式简介(Brief Introduction) 模板方法模式(Template Method Pattern),定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可以重定义算法的某些特定步骤。

一、模板方法模式简介(Brief Introduction

模板方法模式(Template Method Pattern),定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可以重定义算法的某些特定步骤。模板方法模式把不变行为搬移到超类,从而去除子类中的重复代码,实际上模板方法模式就是提供了一个代码复用平台。

二、解决的问题(What To Solve

       要完成在某一细节上层次一致的一个过程或一系列步骤,但个别步骤在更详细的层次上实现不同时,可以使用模版方法模式解决问题。

三、模板方法模式分析(Analysis

1、模板方法模式结构

抽象类AbstractClass,实现了一个模版方法,定义了一个算法框架,具体子类将重新定义PrimitiveOperation1PrimitiveOperation1以实现一个算法的步骤。

子类ConcreteClassAConcreteClassB,实现PrimitiveOperation1PrimitiveOperation1以完成算法中与特定子类相关的步骤。

2、模板方法模式代码

1、抽象模板类AbstractClass及其模板方法TemplateMethod()

public abstract class AbstractClass

{

    public abstract void PrimitiveOperation1();

    public abstract void PrimitiveOperation2();

 

    public void TemplateMethod()

    {

        PrimitiveOperation1();

        PrimitiveOperation2();

        Console.WriteLine("模板方法执行完");

    }

}

 

2、子类ConcreteClassAConcreteClassB实现父类定义的抽象方法

public class ConcreteClassA:AbstractClass

{

    public override void PrimitiveOperation1()

    {

        Console.WriteLine("具体实现类{0}方法1实现",this.GetType().Name);

    }

 

    public override void PrimitiveOperation2()

    {

        Console.WriteLine("具体实现类{0}方法2实现", this.GetType().Name);

    }

}

 

public class ConcreteClassB:AbstractClass

{

    public override void PrimitiveOperation1()

    {

        Console.WriteLine("具体实现类{0}方法1实现", this.GetType().Name);

    }

 

    public override void PrimitiveOperation2()

    {

        Console.WriteLine("具体实现类{0}方法2实现", this.GetType().Name);

    }

}

 

3、客户端代码

static void Main(string[] args)

{

    AbstractClass abstractClass = new ConcreteClassA();

    abstractClass.TemplateMethod();

 

    abstractClass = new ConcreteClassB();

    abstractClass.TemplateMethod();

 

    Console.ReadKey();

}

 

3、模板方法模式运行结果

四.实例分析(Example

1、场景

定义一个数据操作Select的骨架,即Connect连接数据库,Select查询数据返回到数据集DataSet,对得到的结果DataSet进行处理Process查询符合自己的数据。ConnectRun是公用的可以放到抽象类DataAccessObject中,特定步骤SelectProcess交由子类来处理。结构如下图所示

DataAccessObject:定义了一个算法框架,具体子类将重新定义SelectProcess操作。

子类CategoriesProducts:分别实现父类的SelectProcess操作

2、代码

1、抽象模板类DataAccessObject及其模板方法Run

abstract class DataAccessObject

{

    protected string connectionString;

    protected DataSet dataSet;

    public virtual void Connect()

    {

        // Make sure mdb is available to app

        connectionString =

          "provider=Microsoft.JET.OLEDB.4.0;" +"data source=..\\..\\..\\db1.mdb";

    }

    public abstract void Select();

    public abstract void Process();

    public virtual void Disconnect()

    {

        connectionString = "";

    }

 

    // The 'Template Method'

    public void Run()

    {

        Connect();

        Select();

        Process();

        Disconnect();

}

}

 

2、子类CategoriesProducts实现模板类中的方法SelectProcess

class Categories : DataAccessObject

{

    public override void Select()

    {

        string sql = "select CategoryName from Categories";

        OleDbDataAdapter dataAdapter = new OleDbDataAdapter(sql, connectionString);

        dataSet = new DataSet();

        dataAdapter.Fill(dataSet, "Categories");

    }

    public override void Process()

    {

        Console.WriteLine("Categories ---- ");

        DataTable dataTable = dataSet.Tables["Categories"];

        foreach (DataRow row in dataTable.Rows)

        {

            Console.WriteLine(row["CategoryName"]);

        }

        Console.WriteLine();

    }

}

class Products : DataAccessObject

{

    public override void Select()

    {

        string sql = "select ProductName from Products";

        OleDbDataAdapter dataAdapter = new OleDbDataAdapter(sql, connectionString);

        dataSet = new DataSet();

        dataAdapter.Fill(dataSet, "Products");

    }

 

    public override void Process()

    {

        Console.WriteLine("Products ---- ");

        DataTable dataTable = dataSet.Tables["Products"];

        foreach (DataRow row in dataTable.Rows)

        {

            Console.WriteLine(row["ProductName"]);

        }

        Console.WriteLine();

    }

 

}

 

3、客户端代码

static void Main(string[] args)

{

    DataAccessObject daoCategories = new Categories();

 

    daoCategories.Run();

    DataAccessObject daoProducts = new Products();

    daoProducts.Run();

    Console.ReadKey();

}

3、实例运行结果

五、总结(Summary

本文对模板方法模式设计思想、结构和结构代码进行了分析,并以一实例数据操作进一步阐述了模板方法模式的设计及其C#实现。

 

版权

作者:灵动生活 郝宪玮

出处:http://www.cnblogs.com/ywqu

如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章,

img_2c313bac282354945ea179a807d7e70d.jpg

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

 

相关文章
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性与扩展性本文旨在探讨PHP中常见的设计模式及其应用,帮助开发者编写出更加灵活、可维护和易于扩展的代码。通过深入浅出的解释和实例演示,我们将了解如何使用设计模式解决实际开发中的问题,并提升代码质量。
在软件开发过程中,设计模式是一套经过验证的解决方案模板,用于处理常见的软件设计问题。PHP作为流行的服务器端脚本语言,也有其特定的设计模式应用。本文将重点介绍几种PHP中常用的设计模式,包括单例模式、工厂模式和策略模式,并通过实际代码示例展示它们的具体用法。同时,我们还将讨论如何在实际项目中合理选择和应用这些设计模式,以提升代码的可维护性和扩展性。
304 4
|
Go
在golang中发起http请求以获取访问域名的ip地址实例(使用net, httptrace库)
这只是追踪我们的行程的简单方法,不过希望你跟着探险家的脚步,即使是在互联网的隧道中,也可以找到你想去的地方。接下来就是你的探险之旅了,祝你好运!
641 26
|
设计模式 Java 数据安全/隐私保护
Java 设计模式:装饰者模式(Decorator Pattern)
装饰者模式属于结构型设计模式,允许通过动态包装对象的方式为对象添加新功能,提供比继承更灵活的扩展方式。该模式通过组合替代继承,遵循开闭原则(对扩展开放,对修改关闭)。
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
这篇文章详细解释了工厂模式,包括简单工厂、工厂方法和抽象工厂三种类型。每种模式都通过代码示例展示了其应用场景和实现方法,并比较了它们之间的差异。简单工厂模式通过一个工厂类来创建各种产品;工厂方法模式通过定义一个创建对象的接口,由子类决定实例化哪个类;抽象工厂模式提供一个创建相关或依赖对象家族的接口,而不需要明确指定具体类。
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP开发领域,设计模式是解决常见问题的高效方案集合。它们不是具体的代码,而是一种编码和设计经验的总结。单例模式作为设计模式中的一种,确保了一个类仅有一个实例,并提供一个全局访问点。本文将深入探讨单例模式的基本概念、实现方式及其在PHP中的应用。
单例模式在PHP中的应用广泛,尤其在处理数据库连接、日志记录等场景时,能显著提高资源利用率和执行效率。本文从单例模式的定义出发,详细解释了其在PHP中的不同实现方法,并探讨了使用单例模式的优势与注意事项。通过对示例代码的分析,读者将能够理解如何在PHP项目中有效应用单例模式。
|
设计模式 数据库连接 PHP
PHP中的设计模式:如何提高代码的可维护性与扩展性在软件开发领域,PHP 是一种广泛使用的服务器端脚本语言。随着项目规模的扩大和复杂性的增加,保持代码的可维护性和可扩展性变得越来越重要。本文将探讨 PHP 中的设计模式,并通过实例展示如何应用这些模式来提高代码质量。
设计模式是经过验证的解决软件设计问题的方法。它们不是具体的代码,而是一种编码和设计经验的总结。在PHP开发中,合理地使用设计模式可以显著提高代码的可维护性、复用性和扩展性。本文将介绍几种常见的设计模式,包括单例模式、工厂模式和观察者模式,并通过具体的例子展示如何在PHP项目中应用这些模式。
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
323 2
|
设计模式 Java
设计模式--适配器模式 Adapter Pattern
这篇文章介绍了适配器模式,包括其基本介绍、工作原理以及类适配器模式、对象适配器模式和接口适配器模式三种实现方式。
|
设计模式 安全 Java
Java中的单例模式是一种设计模式,它保证一个类只有一个实例,并提供一个全局访问点
Java单例模式确保类仅有一个实例,并提供全局访问点。常见实现包括: - 饿汉式:静态初始化,线程安全。 - 懒汉式:延迟初始化,需同步保证线程安全。 - 双重检查锁定:优化懒汉式,减少同步开销。 - 静态内部类:延迟加载,线程安全。 - 枚举:简洁线程安全,不适用于复杂构造。 - 容器实现:如Spring框架,用于依赖注入。选择依据需求,如延迟加载、线程安全和扩展性。
256 10
|
设计模式 安全 Java
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)
该文介绍了一种C++的编程技巧——奇异递归模板模式(CRTP),旨在让派生组件能继承基本组件的特定功能。通过示例展示了如何创建一个`Fighter`接口和`MmaFighter`类,其中`MmaFighter`及其子类如`MmaBantamweightFighter`和`MmaHeavyweightFighter`强制类型安全,确保相同重量级的拳手之间才能进行比赛。这种设计避免了不同重量级拳手间的错误匹配,编译时会报错。CRTP适用于处理类型冲突、参数化类方法和限制方法只对相同类型实例生效的情况。
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)

热门文章

最新文章