# 深入浅出设计模式——模板方法模式（Template Method Pattern）

Template Method Pattern: Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure.
Frequency of use: medium
UML图

AbstractClass: 抽象类
ConcreteClass: 具体子类

 抽象方法(Abstract Method)
 具体方法(Concrete Method)
 钩子方法(Hook Method)：“挂钩”方法和空方法

TestPaper.cs

using System;

namespace TemplateMethodPattern
{
//金庸小说考题试卷
class TestPaper
{
//试题1
public void TestQuestion1()
{
Console.WriteLine("杨过得到，后来给了，炼成倚天剑、屠龙刀的玄铁是[] a.球磨铸铁 b.马口铁 c.高速合金钢 d.碳素纤维");
}
//试题2
public void TestQuestion2()
{
Console.WriteLine("杨过、程英、陆无双铲除了情花，造成[] a.使这种植物不再害人 b.使一种珍稀物种灭绝 c.破坏了那个生物圈的生态平衡 d.造成该地区沙漠化");
}
//试题3
public void TestQuestion3()
{
Console.WriteLine("蓝凤凰致使华山师徒、桃谷六仙呕吐不止，如果你是大夫，会给他们开什么药[] a.阿司匹林 b.牛黄解毒片 c.氟哌酸 d.让他们喝大量的生牛奶 e.以上全不对");
}

{
return "";
}
{
return "";
}
{
return "";
}
}
}

TestPaperA.cs

using System;

namespace TemplateMethodPattern
{
//学生甲抄的试卷
class TestPaperA : TestPaper
{
//试题1
public new void TestQuestion1()
{
base.TestQuestion1();
}
//试题2
public new void TestQuestion2()
{
base.TestQuestion2();
}
//试题3
public new void TestQuestion3()
{
base.TestQuestion3();
}
{
return "b";
}
{
return "a";
}
{
return "c";
}
}
}

TestPaperB.cs

using System;

namespace TemplateMethodPattern
{
//学生乙抄的试卷
class TestPaperB : TestPaper
{
//试题1
public new void TestQuestion1()
{
base.TestQuestion1();
}
//试题2
public new void TestQuestion2()
{
base.TestQuestion2();
}
//试题3
public new void TestQuestion3()
{
base.TestQuestion3();
}
{
return "d";
}
{
return "b";
}
{
return "a";
}
}
}

Client：客户类

using System;

namespace TemplateMethodPattern
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("学生甲抄的试卷：");
TestPaper studentA = new TestPaperA();
studentA.TestQuestion1();
studentA.TestQuestion2();
studentA.TestQuestion3();

Console.WriteLine("学生乙抄的试卷：");
TestPaper studentB = new TestPaperB();
studentB.TestQuestion1();
studentB.TestQuestion2();
studentB.TestQuestion3();

}
}
}

 模板方法模式在一个类中形式化地定义算法，而由它的子类实现细节的处理。
 模板方法模式是一种代码复用的基本技术。
 模板方法模式导致一种反向的控制结构，通过一个父类调用其子类的操作，通过对子类的扩展增加新的行为，符合“开闭原则”。

 每个不同的实现都需要定义一个子类，这会导致类的个数增加，系统更加庞大，设计也更加抽象，但是更加符合“单一职责原则”，使得类的内聚性得以提高。

 一次性实现一个算法的不变的部分，并将可变的行为留给子类来实现。
 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。
 对一些复杂的算法进行分割，将其算法中固定不变的部分设计为模板方法和父类具体方法，而一些可以改变的细节由其子类来实现。
 控制子类的扩展。

【声明与感谢】

【参考文献】
《设计模式—可复用面向对象软件的基础》作者: [美] Erich Gamma / Richard Helm / Ralph Johnson / John Vlissides 译者: 李英军 / 马晓星 / 蔡敏 / 刘建中 等 机械工业出版社
《重构—改善既有代码的设计》作者: Martin Fowler译者：候捷 中国电力出版社
《敏捷软件开发—原则、模式与实践》作者: Robert C. Martin 清华大学出版社
《程序员修炼之道—从小工到专家》作者: Andrew Hunt / David Thomas 电子工业出版社
《Head First 设计模式》作者: 弗里曼 译者: O'Reilly Taiwan公司 中国电力出版社
《设计模式之禅》 作者: 秦小波 机械工业出版社
MSDN WebCast 《C#面向对象设计模式纵横谈》 讲师：李建忠

《大话设计模式》 作者: 程杰 清华大学出版社
《C#图解教程》作者: 索利斯 译者: 苏林 / 朱晔 人民邮电出版社
《你必须知道的.NET》作者: 王涛
《项目中的.NET》作者: 李天平 电子工业出版社
《Microsoft .NET企业级应用架构设计》作者: （美）埃斯波西托等编著 译者: 陈黎夫
http://www.dofactory.com/Patterns/Patterns.aspx .NET Design Patterns
http://www.cnblogs.com/zhenyulu 博客作者：吕震宇
http://www.cnblogs.com/terrylee 博客作者：李会军
http://www.cnblogs.com/anlyren/ 博客作者：anlyren
http://www.cnblogs.com/idior 博客作者：idior
http://www.cnblogs.com/allenlooplee 博客作者：Allen lee
http://blog.csdn.net/ai92 博客作者：ai92
http://www.cnblogs.com/umlonline/ 博客作者：张传波
http://www.cnblogs.com/lovecherry/ 博客作者：LoveCherry

posted @ 2015-01-04 11:50  Bobby0322  阅读(...)  评论(... 编辑 收藏