Design Pattern Iterator 迭代器设计模式
这个设计模式感觉很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 迭代器设计模式的更多相关文章
- [Design Pattern] Iterator Pattern 简单案例
Iterator Pattern,即迭代时模式,按照顺序依次遍历集合内的每一个元素,而不用了解集合的底层实现,属于行为类的设计模式.为了方便理解记忆,我也会称其为遍历模式. 下面是一个迭代器模式的简单 ...
- Design Pattern Memo 备忘录设计模式
本设计模式就是简单地记录当前状态.然后利用记录的数据恢复. 比方首先我们有一个类.类须要记录当前状态进行相关的工作的: class Memo; class Human { public: string ...
- design pattern Builder 生成器设计模式
其实设计模式可以学习很有趣,你并不需要有这么难啃旱地FOG对我来说,当然,这些都是健康的骨骼啃啃. 在本文中,建造者模式设计一个搞笑的一幕.根据这一模型来学习功夫的方法,哈哈. 基类的第一,设计.那么 ...
- Design Pattern Command 命令设计模式
这种设计模式是使用不同类的包裹不同的命令,达到什么样的命令执行什么操作. 有可能进一步利用map您最喜欢的对接命令字. 正在运行的类实际上已经包含了操作的所有需求,例如: class SuperMak ...
- Design Pattern Bridge 桥设计模式
桥设计模式事实上就是一个简单的has a relationship.就是一个类拥有还有一个类,并使用还有一个类实现须要的功能. 比方遥控器和电视之间能够使用桥设计模式达到能够使用同一个遥控器控制多台电 ...
- Flyweight Design Pattern 共享元设计模式
就是利用一个类来完毕多种任务.不用每次都创建一个新类. 个人认为这个设计模式在C++里面,好像能够就使用一个函数取代,利用重复调用这个函数完毕任务和重复利用这个类,好像几乎相同. 只是既然是一个设计模 ...
- Design Pattern Adaptor 适配器设计模式
适配器设计模式是为了要使用一个旧的接口,或许这个接口非常难用,或许是和新的更新的接口不兼容,所以须要设计一个适配器类,然后就能够让新旧的接口都统一. 就是这种一个图: watermark/2/text ...
- [Design Pattern With Go]设计模式-工厂模式
这次介绍的设计模式是工厂模式,这是一个比较常见的创建型模式.一般情况下,工厂模式分为三种:简单工厂.工厂方法和抽象工厂,下面慢慢举例介绍下. 简单工厂 考虑一个加密程序的应用场景,一个加密程序可能提供 ...
- [Design Pattern With Go]设计模式-单例模式
定义 一个类只允许创建一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫作单例模式.当某些数据只需要在系统中保留一份的时候,可以选择使用单例模式. 饿汉式 饿汉式的实现方式比较简单.在类加 ...
随机推荐
- MinGW 使用 msvcr90.dll
MinGW 编译出来的程序总是使用 VC6 的 msvcrt.dll ,VC8,9,10有很多新的API(仅限于c runtime),想使用怎么办? 比如:boost 对 MinGW 最低要求就是 m ...
- Asp.Net MVC3 简单入门第一季(三)详解Controller之Filter
前言 前面两篇写的比较简单,刚开始写这个系列的时候我面向的对象是刚开始接触Asp.Net MVC的朋友,所以写的尽量简单.所以写的没多少技术含量.把这些技术总结出来,然后一简单的方式让更多的人很好的接 ...
- linux之SQL语句简明教程---HAVING
那我们如何对函数产生的值来设定条件呢?举例来说,我们可能只需要知道哪些店的营业额有超过 $1,500.在这个情况下,我们不能使用 WHERE 的指令.那要怎么办呢?很幸运地,SQL 有提供一个 HAV ...
- 【HDU 4452 Running Rabbits】简单模拟
两只兔子Tom和Jerry在一个n*n的格子区域跑,分别起始于(1,1)和(n,n),有各自的速度speed(格/小时).初始方向dir(E.N.W.S)和左转周期turn(小时/次). 各自每小时往 ...
- smb相关资料
smb相关资料 看资料就上维基 https://en.wikipedia.org/wiki/Server_Message_Block#Implementation http://www.bing.co ...
- magento url rewrite
Magento 设置 Rewrite Url 方法. 1.apache 要加载 Rewrite 扩展模块.2.网站根目录要有 .htaccess 文件.3.Magento 后台要设置启用 Rewrit ...
- UILabel,UITextField 以及UIButton应用
</pre><pre name="code" class="cpp">一.UILabel 它是ioS开发使用的控件来显示文本,它是UIV ...
- rem详解
rem这是个低调的css单位,近一两年开始崭露头角,有许多同学对rem的评价不一,有的在尝试使用,有的在使用过程中遇到坑就弃用了.但是我对rem综合评价是用来做web app它绝对是最合适的人选之一. ...
- 【单点更新,区间查询,线段树】【HDU1166】【敌兵布阵】
线段树要捡回来学了 才知道以前抄的模板就是杭电传奇学长写的,写起来更有激情了: 一点注意: 单点更新完后记得pushup(),向上更新信息 以下是对线段树的理解 线段树的节点代表一段线段,节点编号没有 ...
- Mysql Binlog Dump原理
Register 首先,我们需要伪造一个slave,向master注册,这样master才会发送binlog event.注册很简单,就是向master发送COM_REGISTER_SLAVE命令,带 ...