模板方法模式的目的:在一个方法中定义一个算法,把算法的某些步骤进行抽象。这样可以把这些步骤从方法中移出,并在方法外部定义这些步骤,也可以用一个接口定义这些步骤,从而使其他类可以提供这些步骤。这样可以在不改变算法的结构而重新定义算法的某些特定的步骤。
排序是一个应用了模板方法模式的例子。通过改变排序算法的一个关键步骤,即对两个对象进行比较的步骤,就可以针对不同对象集合的不同属性重用排序算法。
主要解决在软件构建过程中,对于某一项任务,常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或者由于固有的原因而无法和任务的整体结构同时实现。[1]
模板方法模式与适配器模式很类似,两者的目的是为了使用其他开发人员编写的代码。在适配器模式模式中一个对象希望通过一个已经设计好的接口来使用一个服务,该服务已经过另外一个类的对象通过不同的接口来提供了。模板方法模式是一个类提供了一个通用的算法,但是该算法的某个关键步骤由另外一个类来提供。
using
System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
namespace TemplateMethod
... {
public abstract class SortingObject
...{
public abstract void Insert();
public abstract void Sort();
public abstract void Print();
public void Run()
...{
Insert();
Sort();
Print();
}
}
public class Inters : SortingObject
...{
IDictionary<int, string> inters = new Dictionary<int, string>();
public override void Insert()
...{
inters.Add(1, "A");
inters.Add(3, "B");
inters.Add(2, "C");
}
public override void Sort()
...{
//排序过程省略
}
public override void Print()
...{
foreach (KeyValuePair<int, string> kvp in inters)
...{
Console.WriteLine("Name:{0}, Value:{1}", kvp.Value, kvp.Key);
}
}
}
class Program
...{
static void Main(string[] args)
...{
SortingObject sortingObject = new Inters();
sortingObject.Run();
Console.ReadLine();
}
}
}
using System.Collections;
using System.Collections.Generic;
using System.Text;
namespace TemplateMethod
... {
public abstract class SortingObject
...{
public abstract void Insert();
public abstract void Sort();
public abstract void Print();
public void Run()
...{
Insert();
Sort();
Print();
}
}
public class Inters : SortingObject
...{
IDictionary<int, string> inters = new Dictionary<int, string>();
public override void Insert()
...{
inters.Add(1, "A");
inters.Add(3, "B");
inters.Add(2, "C");
}
public override void Sort()
...{
//排序过程省略
}
public override void Print()
...{
foreach (KeyValuePair<int, string> kvp in inters)
...{
Console.WriteLine("Name:{0}, Value:{1}", kvp.Value, kvp.Key);
}
}
}
class Program
...{
static void Main(string[] args)
...{
SortingObject sortingObject = new Inters();
sortingObject.Run();
Console.ReadLine();
}
}
}
[1] http://hi.baidu.com/weizier/blog/item/8fe991587e6697df9d82047c.html