设计模式观后(c++还原之十七 迭代器模式)

//迭代器模式
//现在已经基本感觉没意思了,感觉每个23钟模式围绕着前面的6个原则设计
//只是增加了示例见识,还不见得全记得住。
//估计要用的时候才会迅速找到
//不说了,要加速23钟模式;快点进入模式混合搭配,才能深刻理解

//作者把管理项目信息做了一个迭代器
//先抽象基类
class ProjectIterator;
class IProject {
public:
	virtual void Add(string strname, int nnum, int ncost){}
	virtual string GetProjectInfo(){ return "";}
	virtual ProjectIterator* Iterator() {return NULL;}
};

//迭代器了(为了编译方便就先写迭代器了)
class ProjectIterator {
private:
	deque<IProject*>* m_pdIProject;
	int m_nCurentitem;
public:
	ProjectIterator(deque<IProject*>* p)
		: m_nCurentitem(-1) {
			m_pdIProject = p;
	}

	//判断是否还有元素
	bool HasNext() {
		if (m_pdIProject->size() != m_nCurentitem+1 && m_pdIProject->at(m_nCurentitem+1)) {
			return true;
		}
		return false;
	}

	IProject* Next() {
		m_nCurentitem++;
		return m_pdIProject->at(m_nCurentitem);
	}

	void remove() {}
};

//项目信息类。给了个迭代器接口
class Project : public IProject {
private:
	deque<IProject*>* m_pdIProject;
	string m_strName;
	int m_nNum;
	int m_nCost;

	Project(string strname, int nnum, int ncost)
		: m_strName(strname)
		, m_nNum(nnum)
		, m_nCost(ncost){}

public:
	Project() :m_pdIProject(new deque<IProject*>){}

	void Add(string strname, int nnum, int ncost) {
		m_pdIProject->push_back(new Project(strname, nnum, ncost));
	}

	string inttochar(int a) {
		char buffer[10] = {0};
		_itoa_s(m_nNum, buffer, 10, 10);
		string temp(buffer);
		return temp;
	}

	string GetProjectInfo() {
		string info;
		
		info += "项目名称 " + m_strName;
		info += "\n项目人数 " + inttochar(m_nNum);
		info += "\n项目费用 " + inttochar(m_nCost);
		info += "\n";
		return info;
	}

	ProjectIterator* Iterator() {
		ProjectIterator* p = new ProjectIterator(m_pdIProject);
		return p;
	}
};

class Boss {
public:
	static void main() {
		IProject* p_project = new Project;
		p_project->Add("星球大战项目", 10, 10000);
		p_project->Add("扭曲时空", 100, 10000);
		p_project->Add("超人改造", 1000, 10000);

		ProjectIterator* proit = p_project->Iterator();
		while (proit->HasNext()) {
			string str =  proit->Next()->GetProjectInfo();
			cout << str;
		}
	}
};
//这次封装特点:私有了带参数构造函数类自己调用。new了不带参数构造函数。
int _tmain(int argc, _TCHAR* argv[])
{
	locale::global(locale(""));
	Boss::main();
	system("pause");
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值