c++设计模式概述之模板方法
代码写的不够规范,目的是为了缩短文章篇幅,实际中请不要这样做。
1、概述
如其名,模板,也就是说,有一个已经做好的模板把框架做好了,剩下的,只需要我们将内容填充到模板下。 例如修房屋,框架结构搭建完成(模板框架搭建完成),工人砌砖(子类具体实现内容),砌砖有多种方式。
还有,银行,对客户而言,我们的步骤是查不多一样的: 取号、排队、办理业务、评价业务(可能有)。取号和排队对每个人来说都是一样的, 办理业务和评价因人而异,A是办理取钱业务的,C是办理汇款业务的,D是办理开户业务的... 当然,评价更是因人而异。
模板方法 和 上面的例子就很类似,抽象类中定义了大家公有的部分( 好比银行取号排队),这些在抽象类中实现,非共有的部分由子类实现(好比银行办理业务和评价)。
下面以银行客户业务为例。
2、业务流程类(抽象)
定义了业务流程和公有的业务。
// 银行业务流程(从上到下) class step_bank_job { public: // 取号 virtual void get_id() { cout << "\n取号成功,请等待服务,\n"; }; // 排队 virtual void get_in_line() { cout << "\n正在排队,请耐心等待\n"; }; // 办理业务(每个人要办理的业务是不一样的) virtual void do_job() = 0; // 评价业务(每个人的评价也可能不一样) virtual void comment(std::string str_comment) = 0; };
3、因人而异的业务
这里以取钱为例
// 取钱 class step_bank_job_withdraw : public step_bank_job { public: // 办理业务(每个人要办理的业务是不一样的) void do_job() { cout << "\n正在为您办理取钱业务\n"; } // 评价业务(每个人的评价也可能不一样) void comment(std::string str_comment) { cout << "\n您的宝贵意见:【" << str_comment.c_str() << "】, 感谢您的光临,祝您生活愉快\n"; } };
4、调用范例
1 void call_template() 2 { 3 std::unique_ptr<step_bank_job> pwithdraw(new(std::nothrow) step_bank_job_withdraw); 4 if (!pwithdraw) 5 { 6 cout << "\n 您好,取钱系统故障,正在修复中...."; 7 return; 8 } 9 10 // 办理业务 11 pwithdraw->get_id(); 12 pwithdraw->get_in_line(); 13 pwithdraw->do_job(); 14 pwithdraw->comment(std::string("5星好评")); 15 }
5、业务办理结果: