设计模式之模板方法模式(Template Method)

简介:
在面向对象系统的分析与设计过程中经常会遇到这样一种情况:对于某一个业务逻辑(算法实现)在不同的对象中有不同的细节实现,但是逻辑(算法)的框架(或通用的应用算法)是相同的。Template Method提供了这种情况的一个实现框架。

   Template Method模式是采用继承的方式实现这一点:将逻辑(算法)框架放在抽象基类中,并定义好细节的接口,子类中实现细节。
 
   Strategy模式解决的是和Template Method模式类似的问题,但是Strategy模式是将逻辑(算法)封装到一个类中,并采取组合(委托)的方式解决这个问题。
 
   解决这个问题可以采取两种模式来解决,一是Template模式,二是Strategy模式。本文给出的是Template Method模式。一个通用的Template Method模式的结构图为:

  
2006101001.jpg


 图2-1:Template模式结构图   
   Template Method模式实际上就是利用面向对象中多态的概念实现算法实现细节和高层接口的松耦合。可以看到Template Method模式采取的是继承方式实现这一点的,由于继承是一种强约束性的条件,因此也给Template Method模式带来一些许多不方便的地方。

/// <summary>
    /// 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模式类似的效果,其代价就是空间和时间上的代价。




本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2006/10/10/524745.html,如需转载请自行联系原作者
目录
相关文章
|
2月前
|
设计模式 算法 Java
Java设计模式-模板方法模式(14)
Java设计模式-模板方法模式(14)
|
6月前
|
设计模式 Java 容器
【设计模式】JAVA Design Patterns——Async Method Invocation(异步方法调用模式)
【设计模式】JAVA Design Patterns——Async Method Invocation(异步方法调用模式)
|
4月前
|
设计模式 JavaScript 算法
js设计模式【详解】—— 模板方法模式
js设计模式【详解】—— 模板方法模式
47 6
|
6月前
|
设计模式 安全 Java
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)
该文介绍了一种C++的编程技巧——奇异递归模板模式(CRTP),旨在让派生组件能继承基本组件的特定功能。通过示例展示了如何创建一个`Fighter`接口和`MmaFighter`类,其中`MmaFighter`及其子类如`MmaBantamweightFighter`和`MmaHeavyweightFighter`强制类型安全,确保相同重量级的拳手之间才能进行比赛。这种设计避免了不同重量级拳手间的错误匹配,编译时会报错。CRTP适用于处理类型冲突、参数化类方法和限制方法只对相同类型实例生效的情况。
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)
|
5月前
|
设计模式 算法 关系型数据库
设计模式第七讲-外观模式、适配器模式、模板方法模式详解
系统要求所有的数据库帮助类必须实现ISqlHelp接口,面向该接口编程,如SQLServerHelp类。 此时第三方提供了一个新的MySql的帮助类(假设是dll,不能修改),它的编程规范和ISqlHelp不兼容,这个时候就需要引入适配器类,使二者能相互兼容。
168 0
|
6月前
|
设计模式 算法 Java
Java 设计模式:深入模板方法模式的原理与应用
【4月更文挑战第27天】模板方法模式是一种行为设计模式,主要用于定义一个操作中的算法的框架,允许子类在不改变算法结构的情况下重定义算法的某些特定步骤。
59 1
|
6月前
|
设计模式 Go
[设计模式 Go实现] 行为型~模板方法模式
[设计模式 Go实现] 行为型~模板方法模式
|
6月前
|
设计模式 算法 Java
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
|
6月前
|
设计模式 SQL 算法
【设计模式系列笔记】模板方法模式
模板方法模式是一种行为设计模式,它定义了一个算法的骨架,并允许子类在不改变该算法结构的情况下重新定义算法的某些步骤。这种模式属于行为型模式,它通过将算法的不同部分封装在不同的方法中,从而使子类能够在不改变算法结构的前提下定制算法的某些步骤。
61 0
|
6月前
|
设计模式
设计模式(二)工厂方法模式(Factory Method)
设计模式(二)工厂方法模式(Factory Method)
34 0

热门文章

最新文章