意图:定义一个操作中算法的框架,而将一些步骤延迟到子类中,TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的特定步骤。
这个模式充分体现了依赖倒置原则,高层模块不应依赖低层模块,二者都应依赖于抽象。
程序库开发人员和应用程序开发人员经常会有下面代码:
//程序库开发人员(框架开发人员)
class Library
{
public:
void Step1()
{
//...
}
void Step3()
{
//...
}
void Step5()
{
//...
}
};
//应用程序开发人员
class Application
{
public:
void Step2()
{
//...
}
void Step4()
{
//...
}
};
int main()
{
Library lib();
Application app;
// 应用程序员写逻辑
lib.Step1();
app.Step2();
lib.Step3();
app.Step4();
lib.Step5();
}
分析一个设计好不好就要找出该问题哪些是稳定的部分,哪些是变化的部分。
上面代码中,稳定的部分是解决某个问题的流程,step1-5,而变化的部分是步骤中某几步可能不确定,需要应用程序开发人员去实现,那就有了下面代码:
//程序库开发人员(框架开发人员)
class Library
{
public:
void run()
{
Step1();
Step2();
Step3();
Step4();
Step5();
}
virtual ~Library() {}
protected:
void Step1()//稳定
{
//...
}
void Step3()
{
//...
}
void Step5()
{
//...
}
virtual void Step2() = 0;
virtual void Step4() = 0;
};
//应用程序开发人员
class Application:public Library//一般都是公有继承
{
public:
virtual void Step2()
{
//...
}
virtual void Step4()
{
//...
}
};
int main()
{
Library* pLib = new Application();
pLib->run();
delete pLib;
}
模板方法是一种代码复用的基本技术,它们在类库中尤为重要,他们提取了类库中的公共行为。