您的位置:首页 > 编程语言 > C语言/C++

[设计模式]_[中级]_[模板方法C++例子实现举例]

2013-03-03 21:21 746 查看
场景:
1.有时候设计框架时定义了一套执行流程,比如定义了某个局部流程是分析文件的。但是可能根据不同有不同的分析方法,输出到统一模型里。常见的实现是根据if语句判断不同的文件再调用不同的函数来实现。也有可能有些开发人员直接在if语句体里实现。这样不统一的实现可能会造成代码难以维护,又容易出错,影响别人写好的实现。这时候如果定义了一套实现模板,开发人员只需要实现不同的子类系统即可自动识别判断。这样模块化的思想好处就是模块可以动态删除增加。
比如使用vector<Module>来存储模块.v.add(module),开发人员实现了一个模块之后,告诉负责加载模块的人员add(module)即可,又不会影响别人的代码,又解耦合,维护方便,增加模块又方便。
加载模块的人员只需要没觉这个vector并调用相应的模板方法即可实现动态处理。听明白的童鞋吼一声。^-^

test_method_template.cpp

#include <stdio.h>
#include <iostream>
#include <string>
#include <io.h>

using std::cout;
using std::endl;

//常见的模板方法父类
class TaskTemplate
{
	public:
		TaskTemplate(void * userdata);
		bool Execute();
	protected:
		virtual void* DoingWork(void * userdata){ return NULL;}
		virtual bool DoBeforeWork(void * userdata){ return true;}
		virtual bool DoFinishWork(void * userdata,void* result){ return true;}
	private:
		void* userdata_;
};

TaskTemplate::TaskTemplate(void * userdata)
{
	userdata_ = userdata;
}

bool TaskTemplate::Execute()
{
	if(!DoBeforeWork(userdata_))
	{
		//userdata_check
		cout << "check fail" << endl;
		return false;
	}
	return DoFinishWork(userdata_,DoingWork(userdata_));
}

class DocTask : public TaskTemplate
{
	public:
		DocTask(void * userdata):TaskTemplate(userdata){}
	protected:
		 void* DoingWork(void * userdata)
		 { 
			cout << "Doc DoingWork" << endl;
			return NULL;
		 }
		 bool DoBeforeWork(void * userdata)
		 { 
			cout << "Doc DoBeforeWork" << endl;
			file_ = fopen((const char*)userdata,"w");
			if(!file_)
			{
				return false;
			}
			return true;
		 }
		 bool DoFinishWork(void * userdata,void* result)
		 {
			cout << "Doc DoFinishWork" << endl;
			if(file_)
			{
				cout << "close file" << endl;
				fclose(file_);
				file_ = NULL;
			}
			return true;
		 }
    private:
		FILE* file_;
};

int main(int argc, char *argv[])
{
	cout << "begin" << endl;
    char file[] = "E:\\test_TemplateMethod.txt";
	DocTask tt(file);

	tt.Execute();
	cout << "end..." << endl;
	return 0;
}

输出:

---------- CompileLinkRun ----------
begin
Doc DoBeforeWork
Doc DoingWork
Doc DoFinishWork
close file
end...

Output completed (4 sec consumed) - Normal Termination
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: