这个设计模式感觉非常简单,我们平时写程序的时候也是经常需要调用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。或者做成开源项目了。