引言
翻看微软的PetShop范例的时候,无意中发现了一段代码,是用来对数据库中不同的表建立缓存依赖,其中很巧妙地运用了继承的概念,翻阅资料,方知叫Template Method 设计模式,于是将一些心得跟体会写下来与大家分享。
概念
GoF《设计模式》中说道:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。这就好比我们建房子,整个架构我们定好了,至于往里面添什么不会影响整体的构造。它主要用来解决在软件构建过程中,对于某一项任务,常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或者由于固有的原因而无法和任务的整体结构同时实现,比如因为后期扩展。
应用
下面举个简单的例子说明Template Mothod的应用场景,例子很简单,只是为了说明该模式的使用方式,在实际开发中一般不会如此用。比如开发中常见的对数据库的操作,首先我们要连接数据库,接着要完成我们的操作,最后关闭数据库连接。整个的步骤是这样子的,但是根据数据库的不同会有不同的实现方式。
1 首先我们定义一个抽象类DataAccessBase,它包含4个方法,Connect, Select, Close, Run,具体代码如下所示:
//Abstract Class
public abstract class DataAccessBase
{
//The primitive method, which will be implemented by concrete methods.
protected abstract void Connect();
protected abstract void Select();
protected abstract void Close();
//The template method.
public void Run()
{
Connect();
Select();
Close();
}
}
其中,Connect用来连接数据库,Select用来查询数据库中的数据,Close用来关闭数据库连接,这三个方法根据数据库的不同会有不同的实现方式,故这里将它们定义为抽象方法; 最后,run方法,也就是我们通常说的模板方法(Template Method),定义了操作的序列,也就是前面所说的算法的骨架,骨架是固定的,而实现是可变的,这就是Template Method设计模式的核心思想。
2 接着我们创建一个SqlServerImpl的类,继承DataAccessBase类,重写三个抽象方法,代码如下所示:
//Concrete Class
public class SqlServerImpl : DataAccessBase
{
protected override void Connect()
{
Console.WriteLine("Connect to sql server ");
}
protected override void Select()
{
Console.WriteLine("Select the data from sql server ");
}
protected override void Close()
{
Console.WriteLine("Close the connection with sql server ");
}
}
可以看到SqlServerimpl实现了父类定义的三个抽象方法,下面对代码进行一个简单的测试,代码如下:
//Client for test
public class Client
{
public static void Main(string[] args)
{
//Create instance and call template method
DataAccessBase da = new SqlServerImpl();
da.Run();
}
}
如预期的,输出结果如下:
Connect to sql server …
Select the data from sql server …
Close the connection with sql server …
如果这时候我们还想实现一个oracle的操作,只要再创建一个类OracleImpl继承DataAccessBase并重写三个抽象方法即可,所有的实现类都共用基类中的模板方法Run,这就是Template Method设计模式。
总结
不难发现,所谓的Template Method设计模式,无非是对面向对象继承概念的灵活运用,只要我们遵循面向对象的基本原则(DRY, LSP, SRP, DIP…),掌握基本概念,写出来的代码自然优雅且灵活,所谓的设计模式也无非是那些基本原则的组合运用。
<!-- END entry -->
分享到:
相关推荐
设计模式C++学习之模板方法模式(Template Method)
template-method-demo 模板方法示例
Head First 设计模式 (八) 模板方法模式(Template Method pattern) C++实现
模板方法模式是一种行为设计模式,它在一个方法中定义算法的骨架,将一些步骤延迟到子类中实现。 具体来说,模板方法模式的关键特点包括: 抽象类:在抽象类中定义一个模板方法,该方法给出了算法的框架。 具体...
模板方法(TemplateMethod) 用意:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
C++设计模式课件3_Template Method_模板方法.pdf
5、模板方法 Template Method (定义一个操作中的算法骨架,将其具体算法延迟到子类中) 6、单例 Singleton (保证应用程序中,某个类只有一个实例存在) 7、代理模式、观察者模式、工厂模式、装饰模式等
C++设计模式代码资源3_Template Method_模板方法.zip
TemplateMethod Pattern.unitypackage是一个模板方法模式的小栗子。
主要为大家详细介绍了C++设计模式之模板方法模式TemplateMethod,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
Template Method.rarTemplate Method.rarTemplate Method.rarTemplate Method.rar模板设计模式
主要介绍了C#模板方法模式(Template Method Pattern),以实例形式讲述了C#抽象类模板方法的用法,具有很高的实用价值,需要的朋友可以参考下
模板方法代码(Qt平台)
设计模式——模板方法模式模板方法模式(Template Method Pattern):定义一个操作中的算法骨架,将一些步骤延迟至子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤使用场景:当不变和可...
主要介绍了C++设计模式编程中Template Method模板方法模式的运用,讲到了包括模板方法模式中的细分方法以及适用场景,需要的朋友可以参考下
示例只是简单展示模板方法模式的基本用法,有关示例的细节请看:https://blog.csdn.net/ZhangCurie/article/details/104727167
模板方法模式(Template Method Pattern):定义一个操作中的算法骨架,将一些步骤延迟至子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 下面是一个模板方法模式的一个demo: #!/...
介绍模板方法(TemplateMethod)定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某