您的位置:首页 > 其它

Design Pattern Iterator 迭代器设计模式

2014-06-25 16:13 357 查看
这个设计模式感觉非常简单,我们平时写程序的时候也是经常需要调用iterator的,C++和Java都是。

所以感觉没什么特别的,就是需要模仿C++或者Java的iterator类的功能吧。

这里简单写个,使用C++模仿Java的iterator一些功能,呵呵。

首先我们有一个集合类,而这个集合类包含了其他类,当我们需要遍历这个集合类包含的类的时候,就好使用iterator功能了。

比如有一个原始的类:

class SalesPerson
{
private:
	string name;
	string division;

public:
	explicit SalesPerson(string n = "", string d = "") : name(n), division(d) {}

	string getName()
	{
		return name;
	}

	void print()
	{
		printf("SalesPerson %s is in %s department.\n", name.c_str(), division.c_str());
	}
};


然后下面是集合类包含了上面的类:

class Division
{
private:
	string name;
	SalesPerson **sales;
	int number;
	DivisionIterator *dit;
	int Len;

public:
	Division(string n) : name(n), Len(100), number(0), dit(NULL)
	{
		sales = new SalesPerson*[Len];
		for (int i = 0; i < Len; i++)
		{
			sales[i] = NULL;
		}
	}
	~Division()
	{
		for (int i = 0; i <= number; i++)
		{
			delete sales[i];
		}
		if (sales) delete [] sales;
		if (dit) delete dit;
	}

	string getName()
	{
		return name;
	}
	
	void add(string n)
	{
		sales[number++] = new SalesPerson(n, name);
	}

	DivisionIterator *iterator()
	{
		if (!dit) dit = new DivisionIterator(sales);
		return dit;
	}
};


上面的iterator函数就是返回DivisionIterator类,方便遍历这个集合类里面的类了。

class DivisionIterator
{
private:
	SalesPerson **sales;
	int location;
	int Len;
	
public:
	DivisionIterator(SalesPerson **v) : sales(v), location(0), Len(100)
	{
	}

	SalesPerson *next()
	{
		return sales[location++];
	}

	bool hasNext()
	{
		if (location < Len && sales[location]) return true;
		return false;
	}

	void remove()	//暂时空功能
	{
	}
};


最后测试其遍历功能:

void salesIteratorTest()
{
	Division divs("SalesDep");

	divs.add("Sally");
	divs.add("Jelly");
	divs.add("Lily");
	divs.add("Billy");
	divs.add("Cherry");

	DivisionIterator *it = divs.iterator();
	while (it->hasNext()) 
	{
		SalesPerson *sa = it->next();
		sa->print();
	}
}


结果:



遍历功能是没问题的,这个设计模式运用成功,很简单。

不过最郁闷的不是这个设计模式,而是Flyweight设计模式,感觉就是一个简单的功能函数也归结为一个设计模式,也许我学的还不是很透切吧。

总体来说设计模式还是很有用的,目前正在运用设计模式写框架呢,写成了拿出来show show。或者做成开源项目了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: