蜗牛的家
男儿当自强
posts - 48,  comments - 21,  trackbacks - 0
意图:
定义一个操作中的算法的骨架,而将这些具体骤延的实现迟到子类中.
UML图:

解析:
TemplateMethod的关键在于在基类中定义了一个算法的轮廓,但是算法每一步具体的实现留给了派生类,但是这样也造成设计灵活性不高的缺点,因为轮廓已经定下来了要想改变就比较困难
适用:
一次性实现一个算法的不变的部分,并将可以变的行为留给子类来实现
各子类中公共的行为应被取出来并集中到一个公共父类中以避免代码重复,首先识别现有代码中的不同之处,并且将有不同之处分离为新的操作,最后,用一个调用这些新的操作的模板方法来替换这些不同的代码
控制子类扩展,模板方法只在特定点调用HOOK操作,这样就只允许在这些点进行扩展

#include 
"stdafx.h"
#include 
<iostream>
using namespace std;

//////////////////////////////////////////////////////////////////////////
class AbstractClass
{
public:
    AbstractClass()
{}
    
virtual ~AbstractClass(){}

    
//这个函数定义了算法轮廓
    void TempplateMethod();
protected:
    
virtual void PrimitiveOperation1() = 0;//算法中具体依赖的函数在子类中实现
    virtual void PrimitiveOperation2() = 0;
}
;

class ConCreateClass : public AbstractClass
{
public:
    ConCreateClass()
{}
    
virtual ~ConCreateClass(){}

protected:
    
virtual void PrimitiveOperation1();
    
virtual void PrimitiveOperation2();
}
;
void ConCreateClass::PrimitiveOperation1()
{
    cout 
<< "PrimitiveOperation1 by ConCreateClass\n";
}

void ConCreateClass::PrimitiveOperation2()
{
    cout 
<< "PrimitiveOperation2 by ConCreateClass\n";
}

void AbstractClass::TempplateMethod()
{
    PrimitiveOperation1();
    PrimitiveOperation2();
}

//////////////////////////////////////////////////////////////////////////
int _tmain(int argc, char* argv[])
{
    AbstractClass
* pConCreatetClass = new ConCreateClass;
    pConCreatetClass
->TempplateMethod();

    delete pConCreatetClass;

    system(
"pause");
    
return 0;
}


posted on 2008-08-19 22:54 黑色天使 阅读(218) 评论(0)  编辑 收藏 引用 所属分类: 设计模式

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理



<2008年8月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456

常用链接

留言簿(2)

随笔分类

随笔档案

文章档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜