常見(jiàn)設(shè)計(jì)模式的解析和實(shí)現(xiàn)(C++)之十一-TemplateMethod模式
作用:
定義一個(gè)操作中的算法的骨架,而將一些步驟延遲到子類中。TemplateMethod 使得子類可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。
UML結(jié)構(gòu)圖:

抽象基類:
1)AbstractClass:抽象基類,定義算法的輪廓
解析:
TemplateMethod 的關(guān)鍵在于在基類中定義了一個(gè)算法的輪廓,但是算法每一步具體的實(shí)現(xiàn)留給了派生類.但是這樣也會(huì)造成設(shè)計(jì)的靈活性不高的缺點(diǎn),因?yàn)檩喞呀?jīng)定下來(lái)了要想改變就比較難了,這也是為什么優(yōu)先采用聚合而不是繼承的原因.
實(shí)現(xiàn):
1)TemplateMethod.h

/**//********************************************************************
????created:????2006/07/20
????filename:?????TemplateMethod.h
????author:????????李創(chuàng)
????????????????http://www.shnenglu.com/converse/

????purpose:????TemplateMethod模式的演示代碼
*********************************************************************/

//?抽象基類,定義算法的輪廓
class?AbstractClass


{
public:

????AbstractClass()
{}

????virtual?~AbstractClass()
{}

????//?這個(gè)函數(shù)中定義了算法的輪廓
????void?TemplateMethod();

protected:
????//?純虛函數(shù),由派生類實(shí)現(xiàn)之
????virtual?void?PrimitiveOperation1()?=?0;
????virtual?void?PrimitiveOperation2()?=?0;
};

//?繼承自AbstractClass,實(shí)現(xiàn)算法
class?ConcreateClass
????:?public?AbstractClass


{
public:

????ConcreateClass()
{}

????virtual?~ConcreateClass()
{}

protected:
????virtual?void?PrimitiveOperation1();
????virtual?void?PrimitiveOperation2();
};
2)TemplateMethod.cpp

/**//********************************************************************
????created:????2006/07/20
????filename:?????TemplateMethod.cpp
????author:????????李創(chuàng)
????????????????http://www.shnenglu.com/converse/

????purpose:????TemplateMethod模式的演示代碼
*********************************************************************/

#include?"TemplateMethod.h"
#include?<iostream>

void?AbstractClass::TemplateMethod()


{
????PrimitiveOperation1();
????PrimitiveOperation2();
}

void?ConcreateClass::PrimitiveOperation1()


{
????std::cout?<<?"PrimitiveOperation1?by?ConcreateClass\n";
}

void?ConcreateClass::PrimitiveOperation2()


{
????std::cout?<<?"PrimitiveOperation2?by?ConcreateClass\n";
}

3)Main.cpp

/**//********************************************************************
????created:????2006/07/20
????filename:?????Main.cpp
????author:????????李創(chuàng)
????????????????http://www.shnenglu.com/converse/

????purpose:????TemplateMethod模式的測(cè)試代碼
*********************************************************************/

#include?"TemplateMethod.h"
#include?<stdlib.h>

int?main()


{
????AbstractClass*?pConcreateClass?=?new?ConcreateClass;
????pConcreateClass->TemplateMethod();

????delete?pConcreateClass;

????system("pause");

????return?0;
}
定義一個(gè)操作中的算法的骨架,而將一些步驟延遲到子類中。TemplateMethod 使得子類可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。
UML結(jié)構(gòu)圖:
抽象基類:
1)AbstractClass:抽象基類,定義算法的輪廓
解析:
TemplateMethod 的關(guān)鍵在于在基類中定義了一個(gè)算法的輪廓,但是算法每一步具體的實(shí)現(xiàn)留給了派生類.但是這樣也會(huì)造成設(shè)計(jì)的靈活性不高的缺點(diǎn),因?yàn)檩喞呀?jīng)定下來(lái)了要想改變就比較難了,這也是為什么優(yōu)先采用聚合而不是繼承的原因.
實(shí)現(xiàn):
1)TemplateMethod.h


















































2)TemplateMethod.cpp



































3)Main.cpp



























posted on 2006-07-27 23:06 那誰(shuí) 閱讀(1930) 評(píng)論(2) 編輯 收藏 引用 所屬分類: 設(shè)計(jì)模式