设计模式——模版模式

本文介绍模板方法模式的设计理念,通过示例代码展示了如何定义算法骨架,并允许子类重定义某些步骤而不改变整体结构。适用于希望统一算法流程但又需要灵活扩展的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//==============================================================
//           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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值