模板方法的定义:

模板方法(Template Method)模式的定义如下:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。它是一种类行为型模式。

优点

  1. 它封装了不变部分,扩展可变部分。它把认为是不变部分的算法封装到父类中实现,而把可变部分算法由子类继承实现,便于子类继续扩展。
  2. 它在父类中提取了公共的部分代码,便于代码复用。
  3. 部分方法是由子类实现的,因此子类可以通过扩展方式增加相应的功能,符合开闭原则。

结构

1)抽象类/抽象模板(Abstract Class)
抽象模板类,负责给出一个算法的轮廓和骨架。它由一个模板方法和若干个基本方法构成。这些方法的定义如下。

① 模板方法:定义了算法的骨架,按某种顺序调用其包含的基本方法。

② 基本方法:是整个算法中的一个步骤,包含以下几种类型。

● 抽象方法:在抽象类中声明,由具体子类实现。

● 具体方法:在抽象类中已经实现,在具体子类中可以继承或重写它。

● 钩子方法:在抽象类中已经实现,包括用于判断的逻辑方法和需要子类重写的空方法两种。

设计模式 - 模板方法模式_模板方法模式

代码

设计模式 - 模板方法模式_子类_02

public static void Main(String[] args)
{
StudyAbroad tm = new StudyInAmerica();
tm.TemplateMethod();
}


//抽象类: 出国留学
abstract class StudyAbroad
{
public void TemplateMethod() //模板方法
{
LookingForSchool(); //索取学校资料
ApplyForEnrol(); //入学申请
ApplyForPassport(); //办理因私出国护照、出境卡和公证
ApplyForVisa(); //申请签证
ReadyGoAbroad(); //体检、订机票、准备行装
Arriving(); //抵达
}

public void ApplyForPassport()
{
Console.WriteLine("三.办理因私出国护照、出境卡和公证:");
Console.WriteLine(" 1)持录取通知书、本人户口簿或身份证向户口所在地公安机关申请办理因私出国护照和出境卡。");
Console.WriteLine(" 2)办理出生公证书,学历、学位和成绩公证,经历证书,亲属关系公证,经济担保公证。");
}

public void ApplyForVisa()
{
Console.WriteLine("四.申请签证:");
Console.WriteLine(" 1)准备申请国外境签证所需的各种资料,包括个人学历、成绩单、工作经历的证明;个人及家庭收入、资金和财产证明;家庭成员的关系证明等;");
Console.WriteLine(" 2)向拟留学国家驻华使(领)馆申请入境签证。申请时需按要求填写有关表格,递交必需的证明材料,缴纳签证。有的国家(比如美国、英国、加拿大等)在申请签证时会要求申请人前往使(领)馆进行面试。");
}

public void ReadyGoAbroad()
{
Console.WriteLine("五.体检、订机票、准备行装:");
Console.WriteLine(" 1)进行身体检查、免疫检查和接种传染病疫苗;");
Console.WriteLine(" 2)确定机票时间、航班和转机地点。");
}

public abstract void LookingForSchool();//索取学校资料

public abstract void ApplyForEnrol(); //入学申请

public abstract void Arriving(); //抵达
}

//具体子类: 美国留学
class StudyInAmerica : StudyAbroad
{

public override void LookingForSchool()
{
Console.WriteLine("一.索取学校以下资料:");
Console.WriteLine(" 1)对留学意向国家的政治、经济、文化背景和教育体制、学术水平进行较为全面的了解;");
Console.WriteLine(" 2)全面了解和掌握国外学校的情况,包括历史、学费、学制、专业、师资配备、教学设施、学术地位、学生人数等;");
Console.WriteLine(" 3)了解该学校的住宿、交通、医疗保险情况如何;");
Console.WriteLine(" 4)该学校在中国是否有授权代理招生的留学中介公司?");

}


public override void ApplyForEnrol()
{
Console.WriteLine("二.入学申请:");
Console.WriteLine(" 1)填写报名表;");
Console.WriteLine(" 2)将报名表、个人学历证明、最近的学习成绩单、推荐信、个人简历、托福或雅思语言考试成绩单等资料寄往所申请的学校;");
Console.WriteLine(" 3)为了给签证办理留有充裕的时间,建议越早申请越好,一般提前1年就比较从容。");
}


public override void Arriving()
{
Console.WriteLine("六.抵达目标学校:");
Console.WriteLine(" 1)安排住宿;");
Console.WriteLine(" 2)了解校园及周边环境。");
}
}