模板(Template)模式的核心思想是:给业务逻辑(算法)的具体实现与抽象接口之间解耦。

它定义了一个算法的骨架,将某些步骤延迟到子类中实现。TemplateMethod 使得子类可以在不改变算法整体结构的前提下,重定义算法中的特定步骤。

模板模式通过继承来实现,而策略模式通过组合来实现,两者最终达到相似的目的。

例1


                
                class AbstractClass
                {
                public:
                	virtual void TemplateMethod()
                	{
                		this->Primitive2();
                		this->Primitive1();
                	}
                protected:
                	virtual void Primitive1() = 0;
                	virtual void Primitive2() = 0;
                 };
                
                class ConCreateClass1:public AbstractClass
                {
                public:
                
                	virtual void Primitive2()
                	{
                		cout << __FUNCTION__ << endl;
                	}
                	virtual void Primitive1()
                	{
                		cout << __FUNCTION__ << endl;
                	}
                
                };
                
                
                
                int main(int argc, char *argv[])
                {
                
                	AbstractClass *abs = new ConCreateClass1;
                	abs->TemplateMethod();
                
                
                	system("pause");
                	return 0;
                }

例2

class TowerBase
                {
                public:
                	int _hp;
                	virtual void initWithBase() = 0;
                };
                
                
                class TowerUI:public TowerBase
                {
                public:
                	Texture _texture;
                	virtual void initWithUI() = 0;
                
                };
                
                
                class TowerSun:public TowerUI
                {
                public:
                	void init()
                	{
                		this->initWithBase();
                		this->initWithUI();
                	}
                
                
                	virtual void initWithBase()
                	{
                
                	}
                
                	virtual void initWithUI()
                	{
                
                
                	}
                
                };