设计模式:用C++实现一个迭代器模式,将它应用于分发服务器的重构。

[复制链接]
 楼主| keer_zu 发表于 2015-12-1 16:16 | 显示全部楼层 |阅读模式
头文件:

  1. #ifndef __ITERATOR_H__
  2. #define __ITERATOR_H__

  3. const long DEFAULT_LIST_CAPACITY = 200;

  4. template <class Item>
  5. class List {
  6. public:
  7.         List(long size = DEFAULT_LIST_CAPACITY);
  8.         List(List&);
  9.         ~List();
  10.         List& operator=(const List&);
  11. /*
  12. */
  13.         long Count() const;
  14.         Item& Get(long index) const;
  15.         Item& First() const;
  16.         Item& Last() const;
  17.         bool Includes(const Item&) const;
  18. /*
  19. */
  20.         void Append(const Item&);
  21.         void Prepend(const Item&);
  22. /*
  23. */
  24.         void Remove(const Item&);
  25.         void RemoveLast();
  26.         void RemoveFirst();
  27.         void RemoveAll();
  28. /*
  29. */
  30.         Item& Top() const;
  31.         void Push(const Item&);
  32.         Item& Pop();
  33. };


  34. template <class Item>
  35. class Iterator
  36. {
  37. public:
  38.         virtual void First() = 0;
  39.         virtual void Next() = 0;
  40.         virtual bool IsDone() const = 0;
  41.         virtual Item CurrentItem() const = 0;
  42. protected:
  43. Iterator();
  44. };


  45. template <class Item>
  46. class ListIterator : public Iterator<Item> {
  47. public:
  48.         ListIterator(const List<Item>* aList);
  49. /*
  50. */
  51.         virtual void First();
  52.         virtual void Next();
  53.         virtual bool IsDone() const;
  54.         virtual Item CurrentItem() const;
  55. private:
  56.         const List<Item>* _list;
  57.         long _courrent;
  58. };


  59. template <typename Item>
  60. class ReverseListIterator : public Iterator<Item> {
  61. public:
  62.         ReverseListIterator(const List<Item>* aList);
  63.         virtual void First();
  64.         virtual void Next();
  65.         virtual bool IsDone() const;
  66.         virtual Item CurrentItem() const;
  67. private:
  68.         const List<Item>* _list;
  69.         long _courrent;
  70. };


  71. #endif
 楼主| keer_zu 发表于 2015-12-1 16:17 | 显示全部楼层
这个后续需要继续完善,以具体的list代替List.
 楼主| keer_zu 发表于 2015-12-1 16:18 | 显示全部楼层
具体方法定义:
  1. #include "iterator.h"

  2. template <class Item>
  3. ListIterator<Item>::ListIterator(const List<Item>* aList)
  4.         : _courrent(0)
  5.         , _list(aList)
  6. {

  7. }

  8. template <class Item>
  9. void ListIterator<Item>::First()
  10. {
  11.         _courrent = 0;
  12. }

  13. template <class Item>
  14. void ListIterator<Item>::Next()
  15. {
  16.         _courrent ++;
  17. }

  18. template <class Item>
  19. bool ListIterator<Item>::IsDone() const
  20. {
  21.         return _courrent >= _list->Count();
  22. }

  23. template <class Item>
  24. Item ListIterator<Item>::CurrentItem() const
  25. {
  26.         return _list->Get(_courrent);
  27. }


  28. template <class Item>
  29. ReverseListIterator<Item>::ReverseListIterator(const List<Item>* aList)
  30.         : _courrent(0)
  31.         , _list(aList)
  32. {

  33. }

  34. template <class Item>
  35. void ReverseListIterator<Item>::First()
  36. {
  37.         _courrent = 0;
  38. }

  39. template <class Item>
  40. void ReverseListIterator<Item>::Next()
  41. {
  42.         _courrent ++;
  43. }

  44. template <class Item>
  45. bool ReverseListIterator<Item>::IsDone() const
  46. {
  47.         return _courrent >= _list->Count();
  48. }

  49. template <class Item>
  50. Item ReverseListIterator<Item>::CurrentItem() const
  51. {
  52.         return _list->Get(_courrent);
  53. }

  54. int main()
  55. {

  56.         return 0;
  57. }
 楼主| keer_zu 发表于 2015-12-1 16:19 | 显示全部楼层
List的成员函数(方法)具体的list中实现。所贴代码都可以在linux环境中利用:  g++ -g -o oi iterator.cpp 编译
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1477

主题

12909

帖子

55

粉丝
快速回复 在线客服 返回列表 返回顶部