今天学习了模板方法模式,让我恍然大悟,似曾相识。因为之前自己再设计项目的时候,就用到了这个模式。
当时还不知道自己用的是个模式,只是觉得非常好。很给力。所以,今天学起来很有感受。
这个模式就是利用了面向对象的多态,抽象哪些公用的方法,就不用实现了,其他的按照业务逻辑来独自实现。
等到调用就ok了
今天只能上代码了
// TemplateMethod.cpp : 定义控制台应用程序的入口点。 // //************************************************************************/ /* @filename TemplateMethod.cpp @author wallwind @createtime 2012/10/22 23:30 @function 模板方法模式 @email [email protected] */ /************************************************************************/ #include "stdafx.h" #include <iostream> using namespace std; class FuncBase { public: FuncBase(){} virtual ~FuncBase(){} virtual void doOneStep()=0; //virtual void doTwoStep()=0; virtual void doThreeStep()=0; void process() { doOneStep(); //doTwoStep(); if (m_hook) { doThreeStep(); } } void setHook(bool hook) { m_hook =hook; } private: bool m_hook; }; class FuncBussOne :public FuncBase { public: FuncBussOne(){} ~FuncBussOne(){} virtual void doOneStep() { cout<<"FuncBussOne:doOneStep"<<endl; } //virtual void doTowStep() //{ // cout<<"FuncBussOne:doTowStep"<<endl; //} virtual void doThreeStep() { cout<<"FuncBussOne:doThreeStep"<<endl; } }; class FuncBussTwo :public FuncBase { public: FuncBussTwo(){} virtual ~FuncBussTwo(){} virtual void doOneStep() { cout<<"FuncBussTwo:doOneStep"<<endl; } //virtual void doTowStep() //{ // cout<<"FuncBussTwo:doTowStep"<<endl; // } virtual void doThreeStep() { cout<<"FuncBussTwo:doThreeStep"<<endl; } }; int _tmain(int argc, _TCHAR* argv[]) { FuncBase * f; f= new FuncBussOne; f->setHook(true); f->process(); cout<<"---------"<<endl; f=new FuncBussTwo; f->setHook(false); f->process(); delete f; return 0; }
运行结果
其中process 是父类独有的有的。而其他方法可以根据具体类,具体自己怎么设计了,但是其逻辑过程是不变的。
基类里的私有变量,就是一种钩子模式。呵呵,所有叫hook。
更多文章,欢迎访问:
http://blog.csdn.net/wallwind