概念
迭代器模式是設計模式的行為模式,它的主要設計思想是提供一個可以操作聚合對象(容器或者復雜數據類型)表示(迭代器類)。通過迭代器類去訪問操作聚合對象可以隱藏內部表示,也可以使客戶端可以統一處理不同類型的家具和對象。
適應場景
1、當內部集合的數據結構很復雜并且不希望外部調用知道數據結構的數據組成的時候可以使用迭代器模式。
2、當程序中有很多的重復遍歷代碼的時候,可以使用迭代器模式減傷代碼量,保證程序的易讀性。
3、當代碼能夠用遍歷不同的甚至是無法預知的數據結構時,可以使用迭代器模式。
實現方式
1、使用迭代器模式,我們需要創建兩個類,一個是迭代器接口類,一個是容器類。
2、聲明迭代器接口的時候,需要注意該接口必須提供至少一個方法來獲取集合中的下個元素。也可以實現其他的接口(例如:添加數據接口、獲取最后一個、獲取第一個和元素數目等。)。
3、聲明聚合對象接口的時候,需要實現一個接口用于創建對應的迭代器的方法,其返回值必須是對應的迭代器對象。如果有需求使用其他的迭代器,可以多添加幾個創建迭代器的方法。
4、創建具體的迭代器類,在創建迭代器類的時候除了實現迭代器接口中的方法之外,還需要在構造函數進行迭代器和容器的關聯。
5、創建具體的容器類,除了需要實現容器類的接口之外,還需要實現容器中的具體存儲方式,例如是通過數據還是鏈表進行數據存儲。具體的集合對象在創建迭代器時候必須將自己傳遞給迭代器來創建迭代器和容器之間的連接。
6、到處迭代器模式基本完成,在客戶端使用的時候需要先創建容器,向容器中寫入數據,之后在創建迭代器,創建迭代器之后就可以通過迭代器操作容器了。
類關系圖
示例代碼
#include "MingLingMoShi.h"int main()
{std::cout << "歡迎東哥來到設計模式的世界!\n";//創建命令對象CommandBase* command = new ConcreteCommend();CommandBase* command1 = new ConcreteCommend1();//創建調用者Invoker invoker;invoker.setCommend(command);invoker.execte();invoker.setCommend(command1);invoker.execte();
}
#pragma once
#include <iostream>
using namespace std;//接受者類
class Receiver {
public:Receiver() {}~Receiver() {}void execte() {cout << "Receiver 接收者對象執行操作函數" << endl;}
};//命令基類
class CommandBase
{
public:CommandBase() {}~CommandBase() {}virtual bool execte() = 0;
};//具體命令,不使用接受者
class ConcreteCommend : public CommandBase {
public:ConcreteCommend() {}~ConcreteCommend() {}bool execte() {cout << "ConcreteCommend 沒有使用接受者的命令對象" << endl;return true;}
};//具體命令,使用接受者
class ConcreteCommend1 : public CommandBase {
public:ConcreteCommend1() {}~ConcreteCommend1() {}bool execte() {cout << "ConcreteCommend1 使用接受者的命令對象" << endl;m_receiver = new Receiver();m_receiver->execte();return true;}
private:Receiver* m_receiver;
};//調用者
class Invoker {
public:Invoker() {}~Invoker() {}void setCommend(CommandBase * command) {m_command = command;}void execte() {m_command->execte();}
private:CommandBase* m_command;};