C++ 设计模式:模板方法模式
设计模式运用的重要原则:寻找需求变化点,将变化的部分和稳定的部分分离开,并在变化点所在的位置处应用设计模式。
设计模式的作用就是再变化和稳定中间寻找隔离点,分离稳定和变化。
概念
定义一个操作中的算法的骨架(稳定部分),而将一些步骤(变化部分)延迟到子类中去实现(父类中定义虚函数,子类实现、重写这个虚函数)从而达到整体稳定的情况下产生一些变化的目的。
示例
父类Father
class Father
{
public:
Father() { num = 0; }
Father(int number) { num = number; }
void process()
{
if (can_execute())
{
step_1();
step_2();
cout << "Father::process num[" << num << "]" << endl;
}
}
private:
/* 钩子方法 */
virtual bool can_execute() = 0;
virtual void step_1() = 0;
virtual void step_2() = 0;
protected:
int num;
};
子类A
class A:public Father
{
public:
A() {}
A(int number) { num = number; }
~A() {}
private:
virtual bool can_execute() { return true; }
virtual void step_1()
{
num++;
cout << "A::step_1 num[" << num << "]" << endl;
}
virtual void step_2()
{
num++;
cout << "A::step_2 :num[" << num << "]" << endl;
}
};
子类B
class B :public Father
{
public:
B() {}
B(int number) { num = number; }
~B() {}
private:
virtual bool can_execute() { return true; }
virtual void step_1()
{
num--;
cout << "B::step_1 num[" << num << "]" << endl;
}
virtual void step_2()
{
num--;
cout << "B::step_2 :num[" << num << "]" << endl;
}
};
main
int main()
{
Father * object1 = new A(10);
Father * object2 = new B(10);
cout << "-------------object1-----------------" << endl;
object1->process();
cout << "-------------object2-----------------" << endl;
object2->process();
system("pause");
return 0;
}
执行结果:
父类process()实现了程序骨架,子类A、B根据自己的特点实现自己的逻辑。
使用C++多态实现。
相关概念
晚绑定
在子类中重新实现某些虚函数以产生不同的程序执行结果的代码编写方法,在程序运行时才能根据对象的类型知道执行执行的函数。
早绑定
在编译阶段就已经知道调用的(虚)函数。
int main()
{
cout << "-------------object3-----------------" << endl;
object3->process();
system("pause");
return 0;
}
子类对象A执行process函数为父类的函数,但是虚函数step_1、step_1编译时已经知晓。
钩子方法
can_execute()又称为钩子方法