• 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.
    ", 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。

    或者做成开源项目了。

  • 相关阅读:
    解决Mysql(MyISAM)的读写互斥锁的问题
    XtraDB存储引擎
    VMware虚拟机linux系统时间同步的解决办法centos rhel
    SQL Server数据库查询速度慢的原因和解决方法
    mysql database manual[mysql数据库手册]
    android 相机使用详解概述
    android中进行https连接的方式的详解
    android 获取手机中所有的传感器Sensor类使用方法
    获取手机安装的全部应用的示例教程
    android 全局异常的处理 详解
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5212033.html
Copyright © 2020-2023  润新知