这个设计模式感觉很easy,我们平时敲代码的时候也是常常须要调用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();
}
}

结果:

遍历功能是没问题的,这个设计模式运用成功。非常easy。

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

整体来说设计模式还是非常实用的。眼下正在运用设计模式写框架呢,写成了拿出来show show。

或者做成开源项目了。

Design Pattern Iterator 迭代器设计模式的更多相关文章

  1. [Design Pattern] Iterator Pattern 简单案例

    Iterator Pattern,即迭代时模式,按照顺序依次遍历集合内的每一个元素,而不用了解集合的底层实现,属于行为类的设计模式.为了方便理解记忆,我也会称其为遍历模式. 下面是一个迭代器模式的简单 ...

  2. Design Pattern Memo 备忘录设计模式

    本设计模式就是简单地记录当前状态.然后利用记录的数据恢复. 比方首先我们有一个类.类须要记录当前状态进行相关的工作的: class Memo; class Human { public: string ...

  3. design pattern Builder 生成器设计模式

    其实设计模式可以学习很有趣,你并不需要有这么难啃旱地FOG对我来说,当然,这些都是健康的骨骼啃啃. 在本文中,建造者模式设计一个搞笑的一幕.根据这一模型来学习功夫的方法,哈哈. 基类的第一,设计.那么 ...

  4. Design Pattern Command 命令设计模式

    这种设计模式是使用不同类的包裹不同的命令,达到什么样的命令执行什么操作. 有可能进一步利用map您最喜欢的对接命令字. 正在运行的类实际上已经包含了操作的所有需求,例如: class SuperMak ...

  5. Design Pattern Bridge 桥设计模式

    桥设计模式事实上就是一个简单的has a relationship.就是一个类拥有还有一个类,并使用还有一个类实现须要的功能. 比方遥控器和电视之间能够使用桥设计模式达到能够使用同一个遥控器控制多台电 ...

  6. Flyweight Design Pattern 共享元设计模式

    就是利用一个类来完毕多种任务.不用每次都创建一个新类. 个人认为这个设计模式在C++里面,好像能够就使用一个函数取代,利用重复调用这个函数完毕任务和重复利用这个类,好像几乎相同. 只是既然是一个设计模 ...

  7. Design Pattern Adaptor 适配器设计模式

    适配器设计模式是为了要使用一个旧的接口,或许这个接口非常难用,或许是和新的更新的接口不兼容,所以须要设计一个适配器类,然后就能够让新旧的接口都统一. 就是这种一个图: watermark/2/text ...

  8. [Design Pattern With Go]设计模式-工厂模式

    这次介绍的设计模式是工厂模式,这是一个比较常见的创建型模式.一般情况下,工厂模式分为三种:简单工厂.工厂方法和抽象工厂,下面慢慢举例介绍下. 简单工厂 考虑一个加密程序的应用场景,一个加密程序可能提供 ...

  9. [Design Pattern With Go]设计模式-单例模式

    定义 一个类只允许创建一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫作单例模式.当某些数据只需要在系统中保留一份的时候,可以选择使用单例模式. 饿汉式 饿汉式的实现方式比较简单.在类加 ...

随机推荐

  1. [DevExpress]图表开发工具类 ChartUtils

    /// <summary> /// 基于.NET 3.5的Chart工具类;对应的DevExpress版本:12.1.7; /// </summary> public stat ...

  2. php get_magic_quotes_gpc() addslashes()

    最近学了学PHP,看到这段代码 function daddslashes($str){       return (!get_magic_quotes_gpc())?addslashes($str): ...

  3. q.js实现nodejs顺序调用

    nodejs的异步调用有时候是最让人头疼的,如何能是一些代码顺序的执行呢,这里和大家分享nodejs的promise 什么是promise promise一个标准,它描述了异步调用的返回结果,包括正确 ...

  4. HTML——表格与表单

    1.表格 <table></table> background:背景图片. 属性 值 描述 align left center right 不赞成使用.请使用样式代替. 规定表 ...

  5. Oracle使用imp/exop远程导入导出dmp数据

    在导入导出数据之前,习惯性的检查一下,看看我们自己的机器可不可以连接远程的Oracle主机,检测方法是tnsping SERVICE_NAME.我的机器如下: C:\Users\zx>tnspi ...

  6. hive 函数学习

    NAME PRICE ---- ----- AAA 1.59 AAA 2.00 AAA 0.75 BBB 3.48 BBB 2.19 BBB 0.99 BBB 2.50 I would like to ...

  7. AfxSocketInit()

    作用:初始化Windows套接字 原型:BOOL AfxSocketInit(WSADATA* lpwsaData = NULL ); 参数:lpwsaData 指向WSADATA结构的指针.    ...

  8. cvReleaseImage()函数说明

    IplImage *tmp = NULL; 这一句话定义了一个IplImage类型的指针变量tmp,这个指针变量在内存中的示意图为: tmp = cvLoadImage(file_path); 这句话 ...

  9. JSP(一)

    开宗明义:JSP本质上就是一个Servlet scriplet JSP 变量和函数的声明 局部变量 <% int a = 3;> 全局变量和函数 <%! int a = 3;> ...

  10. 开发移动端web应用, 使用手机自带键盘的搜索按钮

    很多时候在移动端的web页面中, 需要使用搜索功能, 然而页面中并没有太多的空间来放置一个像pc端上那样的搜索按钮, 这时候就需要借用手机输入法自带的搜索按钮来实现点击搜索 虽然不是什么大的功能, 但 ...