add Iterator Pattern

master
FengJungle 2019-11-03 14:20:17 +08:00
parent 7336d1f918
commit 16faa3a386
8 changed files with 167 additions and 4 deletions

View File

@ -1,5 +1,5 @@
#ifndef __COMMAND_PATTERN_H__ #ifndef __INTERPRETOR_PATTERN_H__
#define __COMMAND_PATTERN_H__ #define __INTERPRETOR_PATTERN_H__
#include <vector> #include <vector>
using namespace std; using namespace std;
@ -126,4 +126,4 @@ private:
}; };
#endif //__COMMAND_PATTERN_H__ #endif //__INTERPRETOR_PATTERN_H__

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

@ -0,0 +1,21 @@
#include "Iterator.h"
Television::Television(){}
Television::Television(vector<string> iChannelList){
this->channelList = iChannelList;
}
Iterator* Television::createIterator(){
RemoteControl *it = new RemoteControl();
it->setTV(this);
return (Iterator*)it;
}
int Television::getTotalChannelNum(){
return channelList.size();
}
void Television::play(int i){
printf("现在播放:%s……\n", channelList[i].c_str());
}

View File

@ -0,0 +1,34 @@
#ifndef __AGGREGATE_H__
#define __AGGREGATE_H__
#include <vector>
using namespace std;
// 前向声明,因为两个类互相引用
class Iterator;
class RemoteControl;
// 抽象聚合类 Aggregate
class Aggregate
{
public:
Aggregate(){}
virtual Iterator* createIterator() = 0;
};
// 具体聚合类 Television
class Television :public Aggregate
{
public:
Television();
Television(vector<string> iChannelList);
// 实现创建迭代器
Iterator* createIterator();
// 获取总的频道数目
int getTotalChannelNum();
void play(int i);
private:
vector<string> channelList;
};
#endif //__AGGREGATE_H__

View File

@ -0,0 +1,69 @@
#ifndef _ITERATOR_H_
#define _ITERATOR_H_
#pragma once
#include "Aggregate.h"
#include <vector>
using namespace std;
// 抽象迭代器
class Iterator
{
public:
Iterator(){}
// 声明抽象遍历方法
virtual void first() = 0;
virtual void last() = 0;
virtual void next() = 0;
virtual void previous() = 0;
virtual bool hasNext() = 0;
virtual bool hasPrevious() = 0;
virtual void currentChannel() = 0;
private:
};
// 遥控器:具体迭代器
class RemoteControl :public Iterator
{
public:
RemoteControl(){}
void setTV(Television *iTv){
this->tv = iTv;
cursor = -1;
totalNum = tv->getTotalChannelNum();
}
// 实现各个遍历方法
void first(){
cursor = 0;
}
void last(){
cursor = totalNum - 1;
}
void next(){
cursor++;
}
void previous(){
cursor--;
}
bool hasNext(){
return !(cursor == totalNum);
}
bool hasPrevious(){
return !(cursor == -1);
}
void currentChannel(){
tv->play(cursor);
}
private:
// 游标
int cursor;
// 总的频道数目
int totalNum;
// 电视
Television* tv;
};
#endif

View File

@ -0,0 +1,35 @@
#include <iostream>
#include "Iterator.h"
int main()
{
vector<string> channelList = { "新闻频道", "财经频道", "体育频道", "电影频道", "音乐频道", "农业频道", "四川卫视", "成都卫视" };
// 创建电视
Television *tv = new Television(channelList);
// 创建遥控器
Iterator *remoteControl = tv->createIterator();
// 顺序遍历
printf("顺序遍历:\n");
remoteControl->first();
// 遍历电视所有频道
while (remoteControl->hasNext()){
remoteControl->currentChannel();
remoteControl->next();
}
printf("\n\n");
// 逆序遍历
printf("逆序遍历:\n");
remoteControl->last();
// 遍历电视所有频道
while (remoteControl->hasPrevious()){
remoteControl->currentChannel();
remoteControl->previous();
}
printf("\n\n");
system("pause");
return 0;
}

View File

@ -78,3 +78,7 @@ Jungle设计模式系列
19.设计模式(十九)——解释器模式 19.设计模式(十九)——解释器模式
博客地址https://blog.csdn.net/sinat_21107433/article/details/102864850 博客地址https://blog.csdn.net/sinat_21107433/article/details/102864850
20.设计模式(二十)——迭代器模式
博客地址https://blog.csdn.net/sinat_21107433/article/details/102879383