在面向对象系统的分析与设计过程中经常会遇到这样一种情况:对于某一个业务逻辑(算法实现)在不同的对象中有不同的细节实现,但是逻辑(算法)的框架(或通用的应用算法)是相同的。Template Method提供了这种情况的一个实现框架。
Template Method模式是采用继承的方式实现这一点:将逻辑(算法)框架放在抽象基类中,并定义好细节的接口,子类中实现细节。
Strategy模式解决的是和Template Method模式类似的问题,但是Strategy模式是将逻辑(算法)封装到一个类中,并采取组合(委托)的方式解决这个问题。
解决这个问题可以采取两种模式来解决,一是Template模式,二是Strategy模式。本文给出的是Template Method模式。一个通用的Template Method模式的结构图为:
图2-1:Template模式结构图
Template Method模式实际上就是利用面向对象中多态的概念实现算法实现细节和高层接口的松耦合。可以看到Template Method模式采取的是继承方式实现这一点的,由于继承是一种强约束性的条件,因此也给Template Method模式带来一些许多不方便的地方。
/// Benchmark
/// </summary>
public abstract class AbstractClass
{
public void TemplateMethod()
{
this.Primitive1();
this.Primitive2();
}
protected abstract void Primitive1();
protected abstract void Primitive2();
}
public class ConcreteClass1 : AbstractClass
{
public ConcreteClass1()
{
}
protected override void Primitive1()
{
Console.WriteLine("ConcreteClass1µÄOperation1");
}
protected override void Primitive2()
{
Console.WriteLine("ConcreteClass1µÄOperation2");
}
}
public class ConcreteClass2 : AbstractClass
{
public ConcreteClass2()
{
}
protected override void Primitive1()
{
Console.WriteLine("ConcreteClass2µÄOperation1");
}
protected override void Primitive2()
{
Console.WriteLine("ConcreteClass2µÄOperation2");
}
}
/// <summary>
/// Class1
/// </summary>
class Class1
{
/// <summary>
///
/// </summary>
[STAThread]
static void Main(string[] args)
{
//
// TODO:
//
AbstractClass tmp1 = new ConcreteClass1();
tmp1.TemplateMethod();
tmp1 = new ConcreteClass2();
tmp1.TemplateMethod();
Console.Read();
}
}
Template Method模式的实现关键是将通用算法(逻辑)封装起来,而将算法细节让子类实现(多态)。唯一注意的是我们将原语操作(细节算法)定义为受保护(Protected)成员,对外部只提供模板方法供调用。
Template模式是很简单模式,但是也应用很广的模式。Template Method是采用继承的方式实现算法的异构,其关键点就是将通用算法封装在抽象基类中,并将不同的算法细节放到子类中实现。
Template Method模式获得一种反向控制结构效果,这也是面向对象系统的分析和设计中一个原则----DIP(依赖倒置:Dependency Inversion Principles)。其含义就是父类调用子类的操作(高层模块调用低层模块的操作),低层模块实现高层模块声明的接口。这样控制权在父类(高层模块),低层模块反而要依赖高层模块。
继承的强制性约束关系也让Template Method模式有不足的地方,我们可以看到对于各个ConcreteClass类中的实现的原语方法Primitive (),是不能被别的类复用的。假设我们要创建一个AbstractClass的变体AnotherAbstractClass,并且两者只是通用算法不一样,其原语操作想复用AbstractClass的子类的实现。但是这是不可能实现的,因为ConcreteClass继承自AbstractClass,也就继承了AbstractClass的通用算法,AnotherAbstractClass是复用不了ConcreteClass的实现,因为后者不是继承自前者。
Template Method模式暴露的问题也正是继承所固有的问题,Strategy模式则通过组合(委托)来达到和Template Method模式类似的效果,其代价就是空间和时间上的代价。
相关推荐
模板方法模式(Template Method)是设计模式中行为型模式的一种,它定义了操作中的算法骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。这个模式在C++编程中有着...
模板方法模式是设计模式中的一种行为模式,它在软件工程中扮演着重要的角色,尤其是在C++这样的面向对象编程语言中。这种模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的...
模板方法模式(Template Method Pattern)是一种行为型设计模式,它允许我们定义算法的骨架,并将部分步骤推迟到子类中实现。这种模式使得子类可以在不改变算法结构的情况下重新定义算法的某些步骤。 #### 模式背景...
模板方法模式是设计模式中行为模式的一种,它在软件开发中起到了重要的作用,尤其是在复杂的系统设计中。模板方法模式遵循“开闭原则”,允许我们定义一个算法的骨架,同时允许子类在不改变整体结构的情况下,对算法...
模板方法模式是面向对象设计模式中的一种,它属于行为模式,主要用来定义对象间的一系列操作顺序,而将一些步骤的实现延迟到子类中。这样可以使得子类不改变算法的结构即可重定义该算法的某些特定步骤,从而实现多态...
### 设计模式之模板方法模式解析 #### 一、引言 在软件开发过程中,我们经常面临这样的场景:有一些步骤是固定的,而某些步骤则可能因具体实现而异。为了解决这类问题,设计模式中引入了一种叫做“模板方法模式”的...
在C++设计模式代码资源3_Template Method中,我们可以期待找到一个示例,展示如何在C++中实现模板方法模式。可能包含一个抽象类(如`GameCharacter`),定义了攻击动作的模板方法,以及几个子类(如`Warrior`和`Mage...
在"template-method-demo"这个示例中,我们可以预见到它将展示如何在Java中应用模板方法模式。这个压缩包可能包含以下内容: 1. 一个抽象类(例如:`AbstractClass`),它定义了模板方法。在这个类中,可能会有一个...
模板方法模式是设计模式中行为型模式的一种,它在软件工程中扮演着非常重要的角色,尤其是在Java编程中。模板方法模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。它允许子类不改变一个算法的结构即可重...
模板方法模式是一种行为设计模式,它在一个方法中定义算法的骨架,将一些步骤延迟到子类中实现。 具体来说,模板方法模式的关键特点包括: 抽象类:在抽象类中定义一个模板方法,该方法给出了算法的框架。 具体...
模板方法模式是软件设计模式中的一种行为模式,它在面向对象设计中扮演着重要的角色,尤其是在代码复用和保持代码结构整洁方面。该模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。使得子类可以不改变一...
在这个场景下,"设计模式之模板方法测试代码"指的是一个用于验证模板方法模式实现的C++代码示例。 模板方法模式的核心思想是封装不变的部分,定义可变的行为。这种模式通常用于当有多个类实现了相同算法的不同部分...
模板方法模式的核心概念包含两个主要部分:模板方法(Template Method)和钩子方法(Hook Method)。模板方法是在抽象类中定义的,它包含了整个操作流程的步骤,而这些步骤中有些是具体的,有些是抽象的。抽象步骤由...
模板方法模式(Template Method Pattern)是一种行为设计模式,它允许在父类中定义算法的框架,然后由子类提供具体的实现。这种模式的核心是“模板方法”,它在父类中定义了一个操作的步骤顺序,并将某些步骤声明为...
模板方法模式是一种行为设计模式,它允许在定义行为框架的同时,延迟部分具体步骤到子类中实现。这种模式主要用于在父类中定义算法的骨架,而将一些步骤的实现细节留给子类去完成,从而使得不同的子类可以重用相同的...
本文实例讲述了Python设计模式之模板方法模式。分享给大家供大家参考,具体如下: 模板方法模式(Template Method Pattern):定义一个操作中的算法骨架,将一些步骤延迟至子类中.模板方法使得子类可以不改变一个算法的...
模板模式是一种行为设计模式,它使你能在不破坏封装性的前提下,定义对象间的一系列基本操作,并在子类中实现这些操作的具体步骤。在模板模式中,一个抽象类公开定义了执行它的方法的方式,而将具体实现延迟到子类中...
模板方法模式是设计模式中的一种行为模式,它在软件工程中扮演着重要的角色,尤其是在创建算法族时。这种模式允许我们在抽象类中定义一个算法的框架,而将具体步骤延迟到子类中实现,从而实现了代码复用和扩展。下面...
3. **模板方法(Template Method)**:这是在抽象类中定义的方法,它调用了一个或多个钩子方法(即抽象方法或可选的具体方法)。模板方法执行整体算法的顺序,并且通常在最后调用钩子方法以完成算法的定制部分。 4....