zoukankan      html  css  js  c++  java
  • 行为型模型 迭代器模式

    行为型模型 迭代器模式

     GOOD:提供一种方法顺序访问一个聚敛对象的各个元素,而又不暴露该对象的内部表示。 

    为遍历不同的聚集结构提供如开始,下一个,是否结束,当前一项等统一接口。

    Iterator(迭代器接口):
            该接口必须定义实现迭代功能的最小定义方法集
            比如提供hasNext()和next()方法。
    ConcreteIterator(迭代器实现类):
            迭代器接口Iterator的实现类。可以根据具体情况加以实现。
    Aggregate(容器接口):
            定义基本功能以及提供类似Iterator iterator()的方法。
    concreteAggregate(容器实现类):
            容器接口的实现类。必须实现Iterator iterator()方法。

    /**
     * 行为型模型 迭代器模式
     * Iterator模式也叫迭代模式,是行为模式之一,它把对容器中包含的内部对象的访问委让给外部类,使用Iterator(遍历)按顺序进行遍历访问的设计模式。
     *
     */
    
    #define _CRT_SECURE_NO_WARNINGS
    
    #include <iostream>
    #include <string>
    
    typedef int Object;
    #define SIZE 5
    
    class MyIterator
    {
    public:
        virtual void First() = 0;
        virtual void Next() = 0;
        virtual bool IsDone() = 0;
        virtual Object Currentitem() = 0;
        virtual ~MyIterator() {}
    };
    
    class Aggregate
    {
    public:
        virtual Object getItem(int index) = 0;
        virtual MyIterator *CreateIterator() = 0;
        virtual int getSize() = 0;
        virtual ~Aggregate() {}
    };
    
    class ContreteIierator: public MyIterator
    {
    public:
        ContreteIierator(Aggregate *ag)
        {
            _ag = ag;
            _idx = 0;
        }
        ~ContreteIierator()
        {
            _ag = nullptr;
            _idx = 0;
        }
        virtual void First() override
        {
            _idx = 0;
        }
        virtual void Next() override
        {
            if (_idx < _ag->getSize())
            {
                _idx++;
            }
        }
        virtual bool IsDone() override
        {
            return (_idx == _ag->getSize());
        }
        virtual Object Currentitem() override
        {
            return _ag->getItem(_idx);
        }
    private:
        int _idx;
        Aggregate * _ag;
    };
    
    class ConcreateAggregate: public Aggregate
    {
    public:
        ConcreateAggregate()
        {
            for (int i = 0; i < SIZE; i++)
            {
                object[i] = i+1;
            }
        }
        ~ConcreateAggregate()
        {
            for (int i = 0; i < SIZE; i++)
            {
                object[i] = 0;
            }
        }
        virtual Object getItem(int index) override
        {
            return object[index];
        }
        virtual MyIterator *CreateIterator() override
        {
            return new ContreteIierator(this);
        }
        virtual int getSize() override
        {
            return SIZE;
        }
    
    private:
        Object object[SIZE];
    };
    
    
    void mytest()
    {
        // 创建一个集合
        Aggregate *ag = new ConcreateAggregate();
        // 创建一个遍历这个集合的迭代器
        MyIterator *it = ag->CreateIterator();
    
        // 通过迭代器遍历集合
        for (; !(it->IsDone()); it->Next())
        {
            std::cout << it->Currentitem() << " ";
        }
        std::cout << std::endl;
    
        // 清理相关资源
        delete it;
        delete ag;
    
        return;
    }
    
    int main()
    {
        mytest();
    
        system("pause");
        return 0;
    }
  • 相关阅读:
    Leetcode 92. Reverse Linked List II
    Leetcode 206. Reverse Linked List
    Leetcode 763. Partition Labels
    Leetcode 746. Min Cost Climbing Stairs
    Leetcode 759. Employee Free Time
    Leetcode 763. Partition Labels
    搭建数据仓库第09篇:物理建模
    Python进阶篇:Socket多线程
    Python进阶篇:文件系统的操作
    搭建数据仓库第08篇:逻辑建模–5–维度建模核心之一致性维度2
  • 原文地址:https://www.cnblogs.com/lsgxeva/p/7783871.html
Copyright © 2011-2022 走看看