//==============================================================
// TemplateMethod.h
//
// begin : 2012-05-12
// author : zwq
// describe: 模版方法模式。定义一个操作中的算法骨架,而将一些步骤
// 延迟到子类。模版方法使得子类可以不改变算法的结构即可
// 重定义该算法的某特特定步骤。
//==============================================================
#ifndef _TEMPLATE_METHOD_H_
#define _TEMPLATE_METHOD_H_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
//===============================================================
//
// CAbstractClass
// 抽象类,其实也是一种抽象模版,定义并实现了一个模版方法。
// 这个模版方法一般是一个具体方法,它给出一个顶级逻辑的骨架,
// 而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。
//
//===============================================================
class CAbstractClass
{
public:
CAbstractClass();
virtual ~CAbstractClass();
public:
void Templatemethod();
protected:
virtual void PrimitiveOperation1() = 0;
virtual void PrimitiveOperation2() = 0;
};
//===============================================================
//
// CConcreteClassA
// 具体类,实现父类定义的一个或者多个抽象方法。每一个CAbstractClass
// 都可以有任意多个CConcreteClass与之对应,而每一个CConcreteClass都可以
// 给出这些抽象方法的不同实现从而使得顶级逻辑的实现各不相同。
//
//===============================================================
class CConcreteClassA : public CAbstractClass
{
public:
CConcreteClassA();
virtual ~CConcreteClassA();
protected:
virtual void PrimitiveOperation1();
virtual void PrimitiveOperation2();
};
//===============================================================
//
// CConcreteClassB
// 具体类,实现父类定义的一个或者多个抽象方法。每一个CAbstractClass
// 都可以有任意多个CConcreteClass与之对应,而每一个CConcreteClass都可以
// 给出这些抽象方法的不同实现从而使得顶级逻辑的实现各不相同。
//
//===============================================================
class CConcreteClassB : public CAbstractClass
{
public:
CConcreteClassB();
virtual ~CConcreteClassB();
protected:
virtual void PrimitiveOperation1();
virtual void PrimitiveOperation2();
};
#endif
//==============================================================
// TemplateMethod.cpp
//
// begin : 2012-05-12
// author : zwq
// describe: 模版方法模式。定义一个操作中的算法骨架,而将一些步骤
// 延迟到子类。模版方法使得子类可以不改变算法的结构即可
// 重定义该算法的某特特定步骤。
//==============================================================
#include "stdafx.h"
#include <iostream>
#include "TemplateMethod.h"
using namespace std;
//===============================================================
//
// CAbstractClass
// 抽象类,其实也是一种抽象模版,定义并实现了一个模版方法。
// 这个模版方法一般是一个具体方法,它给出一个顶级逻辑的骨架,
// 而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。
//
//===============================================================
CAbstractClass::CAbstractClass()
{
}
CAbstractClass::~CAbstractClass()
{
}
void CAbstractClass::Templatemethod()
{
PrimitiveOperation1();
PrimitiveOperation2();
}
//===============================================================
//
// CConcreteClassA
// 具体类,实现父类定义的一个或者多个抽象方法。每一个CAbstractClass
// 都可以有任意多个CConcreteClass与之对应,而每一个CConcreteClass都可以
// 给出这些抽象方法的不同实现从而使得顶级逻辑的实现各不相同。
//
//===============================================================
CConcreteClassA::CConcreteClassA()
{
}
CConcreteClassA::~CConcreteClassA()
{
}
void CConcreteClassA::PrimitiveOperation1()
{
cout << "具体类A方法1实现" << std::endl;
}
void CConcreteClassA::PrimitiveOperation2()
{
std::cout << "具体类A方法2实现" << std::endl;
}
//===============================================================
//
// CConcreteClassB
// 具体类,实现父类定义的一个或者多个抽象方法。每一个CAbstractClass
// 都可以有任意多个CConcreteClass与之对应,而每一个CConcreteClass都可以
// 给出这些抽象方法的不同实现从而使得顶级逻辑的实现各不相同。
//
//===============================================================
CConcreteClassB::CConcreteClassB()
{
}
CConcreteClassB::~CConcreteClassB()
{
}
void CConcreteClassB::PrimitiveOperation1()
{
std::cout << "具体类B方法1实现" << std::endl;
}
void CConcreteClassB::PrimitiveOperation2()
{
std::cout << "具体类B方法2实现" << std::endl;
}
// TemplateMethod(模版模式).cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <stdio.h>
#include "TemplateMethod.h"
int main(int argc, char* argv[])
{
CAbstractClass* concreteClassA = new CConcreteClassA;
concreteClassA->Templatemethod();
delete concreteClassA;
concreteClassA = NULL;
CAbstractClass* concreteClassB = new CConcreteClassB;
concreteClassB->Templatemethod();
delete concreteClassB;
concreteClassB = NULL;
return 0;
}
