【设计模式(c++):模板方法模式】

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()又称为钩子方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值