其实设计模式可以学的很有意思的,不需要非得如此硬枯燥地去啃FOG的大部头,当然这些骨头啃啃也健康。
本文利用建造者模式设计一个有趣的场景,一个利用这个模式去学功夫的过程,呵呵。
首先设计一个基类,学功夫先要有基础嘛:
class 功夫 { public: virtual void 看招() = 0; };
有了基础之后,我们就可以学习高级功法了,这里学习降龙十八掌,O(∩_∩)O~。
list<int>容器,相当于记录下来的武功招式了,记住这些招式之后就可以开始学习了。小宝曰:绝世武功这么厚,看也得半年吧。
由于已经失传的缘故,这里只有5招了,呵呵。
class 学习降龙十八掌 : public 功夫 { list<int> 招式; public: 学习降龙十八掌() { } void 学习宝典(list<int> 宝典) { 招式.clear(); 招式 = 宝典; } void 看招() { auto it = 招式.begin(); for ( ; it != 招式.end(); it++) { switch (*it) { case 1: 亢龙有悔(); break; case 2: 飞龙在天(); break; case 3: 见龙在田(); break; case 4: 潜龙勿用(); break; case 5: 震惊百里(); break; default: 已失传(); } } } void 亢龙有悔() { puts("\n亢龙有悔:\n说着左腿微屈,右臂内弯,右掌划了个圆圈,呼的一声,向外推去,手掌扫到面前一棵松树,喀喇一响,松树应手断折。\n 他左手划个半圆,右手一掌推出,正是生平得意之作“降龙十八掌”中的「亢龙有悔」"); } void 飞龙在天() { puts("\n飞龙在天:\n洪七公把“降龙十八掌”中的第二招「飞龙在天」教了郭靖。\n这一招跃起半空,居高下击,威力奇大,郭靖花了三天工夫,方才学会。"); } void 见龙在田() { puts("\n见龙在田:\n郭靖见他越逼越近,早有提防,当他右手离黄蓉身前尺许之际,左掌圆劲,右掌直势,使招「见龙在田」,挡在黄蓉身前。\n这一招纯是防御,却是在黄蓉与渔人之间布了一道坚壁,敌来则挡,敌不至则消于无形。"); } void 潜龙勿用() { puts("\n潜龙勿用:\n郭靖暗叫:“不好!”全身已感酸麻,危急中右手屈起食中两指,半拳半掌,向她胸口打去,那是「潜龙勿用」的半招,本来左手同时向里钩拿,右推左钩,敌人极难闪避,现下左腕被拿,只得使了半招。"); } void 震惊百里() { puts("\n震惊百里:\n欧阳锋叫声:“好!”第二推又已迅速异常的赶到,前劲未衰,后劲继至。\n郭靖猛觉得劲风罩上身来,心知不妙,一招「震惊百里」,也是双掌向前平推,这是降龙十八掌中威力极大的一招。"); } void 已失传() { puts("\n已失传\n"); } };
有了武功宝典之后,就可以由人进行学习啦,理论上谁都可以学习的,看有缘人是谁吧:
class 学习对象 { public: virtual void 学亢龙有悔() = 0; virtual void 学飞龙在天() = 0; virtual void 学见龙在田() = 0; virtual void 学潜龙勿用() = 0; virtual void 学震惊百里() = 0; virtual void 学多了() = 0; virtual 功夫 *学成() = 0; };
这个有缘人就是郭大侠啦:
class 郭靖 : public 学习对象 { 学习降龙十八掌 *秘籍; list<int> 招式; public: 郭靖() { 秘籍 = new 学习降龙十八掌; } void 学亢龙有悔() { 招式.push_back(1); } void 学飞龙在天() { 招式.push_back(2); } void 学见龙在田() { 招式.push_back(3); } void 学潜龙勿用() { 招式.push_back(4); } void 学震惊百里() { 招式.push_back(5); } void 学多了() { 招式.push_back(6); } 功夫 *学成() { 秘籍->学习宝典(招式); return 秘籍; } ~郭靖() { delete 秘籍; } };
然后是运行:
void 打功夫() { 学习对象 *郭大侠 = new 郭靖; 郭大侠->学飞龙在天(); 郭大侠->学见龙在田(); 郭大侠->学亢龙有悔(); 郭大侠->学潜龙勿用(); 郭大侠->学震惊百里(); 郭大侠->学多了(); 功夫 *降龙掌 = 郭大侠->学成(); 降龙掌->看招(); }
最后运行结果:
总结其思想:
已经有了一本武功秘籍了-”学习降龙十八掌“,但是不一定要全部学完的,所以书中记录了各种招式,可以让人选择,并使用容器list<int>记录人的选择。
这个选择是由认为做出的-郭靖,选择好之后,再最终生成最后的武功招式。这里的-看招函数就是按照list<int>的内容一招一招打出去的。
呵呵,本程序是在vs2012上运行的,由于是全中文,故此vs6肯定是不能运行的了。
design pattern Builder 建造者设计模式
时间: 2024-10-10 01:00:24