程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Design Pattern Iterator 迭代器設計模式

Design Pattern Iterator 迭代器設計模式

編輯:C++入門知識

這個設計模式感覺非常簡單,我們平時寫程序的時候也是經常需要調用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。或者做成開源項目了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved