由于其自身的缺陷,继承是由邪恶的帽子专家抓住。而不是继承的代表,尽可能的使用接口而不是抽象类继承等专家警告,让我们这些菜鸟特别尊重继承。事实上,有许多优势,继承更明显。它似乎被虐待的人,继承关系的合理使用,或者你可以在系统的设计中起到很好的作用,模板方法模式是一个使用的例子。

GOF定义一个操作中的算法的模板方法的骨架(模板方法)模式,和延迟的一些子类的步骤。子类可以重新定义算法中的某些步骤不改变结构的一种算法。该算法的结构,在这里可以理解为你按设计的要求业务流程。具体步骤是指可能存在的那些链接的内容。

可以看出,模板方法模式也是为了巧妙地解决变化对系统的影响而设计的,模板方法的使用使得系统的可扩展性得到增强,并减少了系统变化的影响,这一点在下面的例子中可以清楚地看到。
复制代码代码如下所示:
< PHP

*模板模式
*
*定义操作中的算法骨架,并将一些步骤推迟到子类,这样子类不能改变算法的结构,并且可以定义算法的某些特定步骤。
*
* /
抽象类templatebase
{
公共函数方法()
{
回声抽象方法;
}

公共函数法()
{
回声抽象法;
}

公共函数方法()
{
回声抽象方法;
}

公共函数doSomething()
{
美元->方法();
美元->法();
美元->方法();
}
}

类templateobject延伸templatebase
{
}

类templateobject1延伸templatebase
{
公共函数方法()
{
回声templateobject1方法;
}
}

类templateobject2延伸templatebase
{
公共函数法()
{
回声templateobject2法;
}
}

实例化
objtemplate美元=新templateobject();
objtemplate1美元=新templateobject1();
objtemplate2美元=新templateobject2();

objtemplate美元-> doSomething();
objtemplate1美元-> doSomething();
objtemplate2美元-> doSomething();

AbstractClass(抽象类):定义一个或多个具体的子类来实现抽象方法,并实现了定义一个算法的骨架模板法,模板法不仅需要以前的抽象方法,也可以调用其他的操作,只要能完成自己的使命。

ConcreteClass(类):实现父类中的抽象方法来完成一个特定的子类相关的算法步骤。

通过对上面定义的分析和实例的说明,可以看出模板法适用于以下情况:

算法的不变部分立即实现,变量行为留给子类。
每个子类中的公共行为应该被提取并集中在一个共同的父类中,以避免代码重复。事实上,这可以说是一个良好的编码习惯。
控制子类扩展。模板方法只被调用的特殊点,这样就只允许在这些点延伸。例如,上述runbare()方法仅适用于安装方法之前运行测试。如果你不想让子类修改你的模板方法定义的框架,你可以在两种方式做到:第一,不体现在API模板法;二,设置你的模板方法,最终。
正如你所看到的,使用模板方法模式可以提取的代码实现复用的目的的公共行为,此外,在模板方法模式中,父类的模板方法在子类中的具体实施控制。所以当你实现一个类,你不必在所有的业务流程了解多少。