Template 模式

原创 2016年06月01日 15:04:16

问题

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


解决方案

Template 提供了这种情况的一个实现框架。Template 模式是采用继承的方式实现这一点: 将逻辑(算法) 框架放在抽象基类中(non-virtual function), 并定义好细节的接口(pure virtual function),子类中实现细节。

一个通用的 Template 模式的结构图为:
这里写图片描述


代码实现

#pragma once

//TemplatePattern.h

namespace TemplatePattern
{
    class AbstractClass
    {
    public:
        virtual ~AbstractClass();
        void TemplateMethod();
    protected:
        virtual void PrimitiveOperation1() = 0;
        virtual void PrimitiveOperation2() = 0;
        AbstractClass();
    private:
    };

    ////////////////////////////////////////////////////////////////////////////
    class ConcreteClass1:public AbstractClass
    {
    public:
        ConcreteClass1();
        ~ConcreteClass1();
    protected:
        void PrimitiveOperation1();
        void PrimitiveOperation2();
    private:
    };

    ////////////////////////////////////////////////////////////////////////////
    class ConcreteClass2:public AbstractClass
    {
    public:
        ConcreteClass2();
        ~ConcreteClass2();
    protected:
        void PrimitiveOperation1();
        void PrimitiveOperation2();
    private:
    };
}

//TemplatePattern.cpp
#include "TemplatePattern.h"
#include <iostream>

using namespace std;
namespace TemplatePattern
{
    //////////////////////////////////////////////////////////////
    AbstractClass::AbstractClass()
    {
    }
    AbstractClass::~AbstractClass()
    {
    }
    void AbstractClass::TemplateMethod()
    {
        this->PrimitiveOperation1();
        this->PrimitiveOperation2();
    }


    ///////////////////////////////////////////////////////////////////////////////
    ConcreteClass1::ConcreteClass1()
    {
    }
    ConcreteClass1::~ConcreteClass1()
    {
    }
    void ConcreteClass1::PrimitiveOperation1()
    {
        cout<<"ConcreteClass1...PrimitiveOperation1"<<endl;
    }
    void ConcreteClass1::PrimitiveOperation2()
    {
        cout<<"ConcreteClass1...PrimitiveOperation2"<<endl;
    }


    ////////////////////////////////////////////////////////////////////////////
    ConcreteClass2::ConcreteClass2()
    {
    }
    ConcreteClass2::~ConcreteClass2()
    {
    }
    void ConcreteClass2::PrimitiveOperation1()
    {
        cout<<"ConcreteClass2...PrimitiveOperation1"<<endl;
    }
    void ConcreteClass2::PrimitiveOperation2()
    {
        cout<<"ConcreteClass2...PrimitiveOperation2"<<endl;
    }
}
//main.cpp
#include "Test.h"


#include "TemplatePattern.h"
int main()
{
    TemplatePattern::AbstractClass *p1 = new TemplatePattern::ConcreteClass1();
    TemplatePattern::AbstractClass *p2 = new TemplatePattern::ConcreteClass2();

    p1->TemplateMethod();
    p2->TemplateMethod();

    delete p1;
    delete p2;

    return 0;

}

讨论

  Template 模式是很简单模式,但是也应用很广的模式。如上面的分析和实现中阐明的
Template 是采用继承的方式实现算法的异构,其关键点就是将通用算法封装在抽象基类中,并将不同的算法细节放到子类中实现。
  Template 模式获得一种反向控制结构效果, 这也是面向对象系统的分析和设计中一个原则 DIP(依赖倒置: Dependency Inversion Principles)。 其含义就是父类调用子类的操作(高层模块调用低层模块的操作),低层模块实现高层模块声明的接口。这样控制权在父类(高层模块),低层模块反而要依赖高层模块。
  继 承 的 强 制 性 约 束 关 系 也 让 Template 模 式 有 不 足 的 地 方 , 我 们 可 以 看 到 对 于ConcreteClass 类中的实现的原语方法 Primitive1(),是不能被别的类复用。假设我们要创建一个 AbstractClass 的变体 AnotherAbstractClass,并且两者只是通用算法不一样,其原语操作想复用 AbstractClass 的子类的实现。但是这是不可能实现的,因为ConcreteClass 继承自AbstractClass,也就继承了 AbstractClass 的通用算法,AnotherAbstractClass 是复用不了ConcreteClass 的实现,因为后者不是继承自前者。
  Template 模式暴露的问题也正是继承所固有的问题,

版权声明:本文为博主原创文章,未经博主允许不得转载。

JAVA设计模式之 模板方法模式【Template Method Pattern】

一、概述 二、适用chuangk
  • l416112167
  • l416112167
  • 2014年11月11日 01:09
  • 2814

模板方法模式(Template Method) - 最易懂的设计模式解析

前言今天我来全面总结一下Android开发中最常用的设计模式 - 模板方法模式。 其他设计模式介绍 1分钟全面了解“设计模式” 单例模式(Singleton) - 最易懂的设计模式解析...
  • carson_ho
  • carson_ho
  • 2017年02月07日 15:37
  • 4957

Template Method模式和Strategy模式有何异同

Template Method模式和Strategy模式有何异同 博客分类:  设计模式 Java  Template Method模式很容易理解,就是由基类提供一个模板,将各...
  • qing419925094
  • qing419925094
  • 2014年03月27日 23:43
  • 451

(C++实现)——模板方法模式(Template Method Pattern)

概述:      我们最近在开发一个支持多种压缩类型文件的解压缩且制作成pdf的一个应用。对我们的架构来说我们需要支持多种压缩文件类型,但却有固定的操作顺序(先解压缩,在读取里面的文件分析、制作...
  • u011676589
  • u011676589
  • 2013年09月18日 14:21
  • 1003

Spring MVC之@RequestMapping 详解【重点:指定的地址可以是URI Template 模式】

引言: 前段时间项目中用到了REST风格来开发程序,但是当用POST、PUT模式提交数据时,发现服务器端接受不到提交的数据(服务器端参数绑定没有加任何注解),查看了提交方式为applicatio...
  • u011350541
  • u011350541
  • 2017年05月19日 22:23
  • 229

TemplateMethod模板方法模式之应用

一,定义:模板方法模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。            二,类图:  ...
  • liujiahan629629
  • liujiahan629629
  • 2014年02月22日 19:37
  • 2338

封装算法: 模板方法(Template Method)模式

template method(模板方法)模式是一种行为型设计模式,它在一个方法中定义了算法的骨架(这个方法被称为template method,模板方法),并将算法的具体步骤放到具体的子类中去实现。...
  • lihao21
  • lihao21
  • 2015年08月24日 14:24
  • 1268

设计模式 - Template模式

1 问题在面向对象系统的分析与设计过程中经常会遇到这样一种情况: 对于某一个业务逻辑 (算法实现)在不同的对象中有不同的细节实现, 但是逻辑(算法)的框架(或通用的应用 算法)是相同的。 Templa...
  • wdsdsdsds
  • wdsdsdsds
  • 2016年05月23日 21:00
  • 137

模板模式(Templete)是面向对象的哪一个原则的体现

a,开闭原则 OCP b,里氏迭代原则 LSP c,单一职责y
  • waiwai4701
  • waiwai4701
  • 2014年04月24日 23:00
  • 453

设计模式 Template模式

在面向对象系统的分析与设计过程中经常会遇到这样一种情况: 一个流程可以分为A,B,C….多个步骤,但在具体的步骤中可能会有不同的情况出现,这时就Template模式就非常有用:class P(obje...
  • caoxing81
  • caoxing81
  • 2015年06月06日 20:07
  • 267
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Template 模式
举报原因:
原因补充:

(最多只允许输入30个字)