design pattern Builder 建造者设计模式

其实设计模式可以学的很有意思的,不需要非得如此硬枯燥地去啃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

design pattern Builder 建造者设计模式的相关文章

Abstract Factory Design Pattern 抽象工厂设计模式 - 总结

Abstract Factory Design Pattern 就是一般的Factory Design Pattern的进一步设计,增加一个抽象工厂,然后利用这个工厂可以创建不同基类的类. 当我们需要创建更多不同类的时候就可以使用这个设计模式了. 这个设计模式的代码相对会多点,但是其中的思想就是一般Factory Design Pattern,然后集合更多的基类,看起来挺大的一个设计模式,其思想是挺简单的. 其中具体的实现细节当然是可以有多种实现方法的: 1 利用Factory的基类衍生出不同的

Design Pattern Prototype 原型设计模式

Prototype设计模式其实就是利用一个深拷贝的功能,在原有的类中,通过一个clone函数,创建一个新的类,并可以利用好原有的数据. 这样可以轻易clone出多个新的对象操作,而且都有各自的内存空间. #include <string> #include <iostream> using namespace std; class MultiData { protected: bool b; char c; string s; int a; public: virtual Mult

Flyweight Design Pattern 共享元设计模式

就是利用一个类来完成多种任务,不用每次都创建一个新类. 个人觉得这个设计模式在C++里面,好像可以就使用一个函数代替,利用反复调用这个函数完成任务和反复利用这个类,好像差不多. 不过既然是一个设计模式,那么就使用类来完成任务.而对于Java来说是不面向过程的,故此就必须使用这个设计模式了. 我这里设计一个仓库来保存这样的类,需要的时候反复取出来使用. 非常简单的设计模式: #include <stdio.h> class ReusedObject { public: ReusedObject(

Design Pattern Bridge 桥设计模式

桥设计模式其实就是一个简单的has a relationship,就是一个类拥有另一个类,并使用另一个类实现需要的功能. 比如遥控器和电视之间可以使用桥设计模式达到可以使用同一个遥控器控制多台电视机的目的. 这样的设计思想是多种设计模式反反复复使用基本思想. 仔细思考下会发现多种设计模式的底层思想其实是相通的,不过具体实现或者某些细节,应用等有那么一点差别罢了. 下面就实现一个TV和remoter类,其中的remoter是可以随时更换的. #include <stdio.h> class Re

Design Pattern Facade 门面设计模式

Facade设计模式主要作用是因为有个很难使用的类,然后要设计一个新类,整理好这个类,使得其更好使用. 比如有类如此: class MessyClass { char *name; public: MessyClass() : name(new char[3]) { for (int i = 0; i < 3; i++) { name[i] = ' '; } } ~MessyClass() { delete [] name; } void setFirstName(char a) { name[

Design Pattern Memo 备忘录设计模式

本设计模式就是简单地记录当前状态,然后利用记录的数据恢复. 比如首先我们有一个类,类需要记录当前状态进行相关的工作的: class Memo; class Human { public: string state; Memo *makeMemo(); void restroDataFromMemo(Memo *m); void show() { cout<<"State: "<<state<<endl; } }; 这里面的state可以是任意定义的数

Design Pattern Iterator 迭代器设计模式

这个设计模式感觉非常简单,我们平时写程序的时候也是经常需要调用iterator的,C++和Java都是. 所以感觉没什么特别的,就是需要模仿C++或者Java的iterator类的功能吧. 这里简单写个,使用C++模仿Java的iterator一些功能,呵呵. 首先我们有一个集合类,而这个集合类包含了其他类,当我们需要遍历这个集合类包含的类的时候,就好使用iterator功能了. 比如有一个原始的类: class SalesPerson { private: string name; strin

Design Pattern - Observer 观察者设计模式

Spy on enemy. 使用这个模式可以根据某些事件自动更新. 设计思路: 1 设计一个基类,作为需要观察一个时间行为的接口类 2 设计一个观察者类,可以观察所有基类的衍生类, 这里使用set来保存这些需要更新的类. 一个事件相当于一个函数,事件发生(调用函数)同时自动调用需要更新的函数动作. #pragma once #include <iostream> #include <string> #include <set> #include <vector&g

Design Pattern Visitor 访问者设计模式

访问者设计模式是已经有了一组Person对象了,然后不同的访问者访问这组对象,会有不同效果. 这些访问者实际上就是一个可以让Person对象组执行的动作行为等. 至于这些Person对象是如何执行这些访问者的动作的,那是已经在特定的不同的Person对象中设计好的. 比如我们的访问者也许是一些动作集合的类,如: class Action { public: string present; string gun; virtual void drinkBeer(Person *p) = 0; vir