zoukankan      html  css  js  c++  java
  • CSharp设计模式读书笔记(17):迭代器模式(学习难度:★★★☆☆,使用频率:★★★★★)

    迭代器模式(Iterator Pattern):提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cursor)。

    模式角色与结构:

    实现代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace CSharp.DesignPattern.IteratorPattern
    {
        class Program
        {
            static void Main(string[] args)
            {
                List<Object> objects = new List<Object>();  
                objects.Add("倚天剑");  
                objects.Add("屠龙刀");  
                objects.Add("断肠草");  
                objects.Add("葵花宝典");  
                objects.Add("四十二章经");  
                  
                Aggregate list;  
                Iterator iterator;  
              
                list = new ConcreteAggregate(objects); // 创建聚合对象  
                iterator = list.CreateIterator();   // 创建迭代器对象  
              
                Console.WriteLine("正向遍历:");      
                while(!iterator.IsLast()) {  
                    Console.WriteLine(iterator.GetNextItem() + "");  
                    iterator.Next();  
                }  
                Console.WriteLine();  
                Console.WriteLine("-----------------------------");  
                Console.WriteLine("逆向遍历:");  
                while(!iterator.IsFirst()) {
                    Console.WriteLine(iterator.GetPreviousItem() + "");  
                    iterator.Previous();  
                }
    
                Console.ReadLine();
            }
        }
    
        // 抽象迭代器
        interface Iterator
        { 
            void Next(); // 指向下一个元素  
            void Previous(); // 移至上一个元素 
            Boolean IsLast(); // 判断是否为最后一个元素  
            Boolean IsFirst(); // 判断是否为第一个元素  
            Object GetNextItem(); // 获取下一个元素  
            Object GetPreviousItem(); // 获取上一个元素
        }
    
        // 具体迭代器
        class ConcreteIterator : Iterator 
        {  
            private ConcreteAggregate aggregate; // 维持一个对具体聚合对象的引用,以便于访问存储在聚合对象中的数据  
            private List<Object> objects;
    
            private int cursor1; // 定义一个游标,用于记录当前访问位置  
            private int cursor2;
    
            public ConcreteIterator(ConcreteAggregate aggregate)
            {
                this.aggregate = aggregate;
                this.objects = aggregate.GetObjects(); // 获得集合对象
    
                cursor1 = 0; // 设置正向遍历游标的初始值  
                cursor2 = objects.Count - 1; // 设置逆向遍历游标的初始值 
            }
    
            public void Next()
            {
                if (cursor1 < objects.Count)
                {
                    cursor1++;
                }
            }
    
            public void Previous()
            {
                if (cursor2 > -1)
                {
                    cursor2--;
                }
            }
    
            public Boolean IsLast()
            {
                return (cursor1 == objects.Count);
            }
    
            public Boolean IsFirst()
            {
                return (cursor2 == -1);
            }
    
            public Object GetNextItem()
            {
                return objects[cursor1];
            }
    
            public Object GetPreviousItem()
            {
                return objects[cursor2];
            }
        }
    
        // 抽象聚合类
        abstract class Aggregate
        {
            protected List<Object> objects = new List<Object>();
    
            public Aggregate(List<Object> objects)
            {  
                this.objects = objects;  
            }  
          
            public void AddObject(Object obj) {  
                this.objects.Add(obj);  
            }  
          
            public void RemoveObject(Object obj) {  
                this.objects.Remove(obj);  
            }  
          
            public List<Object> GetObjects() {  
                return this.objects;  
            }
    
            // 声明创建迭代器对象的抽象工厂方法 
            public abstract Iterator CreateIterator();
        }
    
        // 具体聚合类
        class ConcreteAggregate : Aggregate 
        {
            public ConcreteAggregate(List<Object> objects)
                : base(objects)
            { }
       
            public override Iterator CreateIterator() 
            {  
                return new ConcreteIterator(this);  
            }  
        } 
    }
  • 相关阅读:
    arm-linux-gcc编译时出现stray '357''273' '277' in program的解决方法
    C#中dynamic的正确用法
    C# 利用反射调用类下的方法
    C# 如何利用反射,将字符串转化为类名并调用类中方法
    将string转为同名类名,方法名。(c#反射)
    MethodInfo类的一般使用
    easyUi弹出window窗口传值与调用父页面的方法,子页面给父页面赋值
    [收集] 各式各样的 无限级分类 的数据库设计方案
    JavaScript随机生成信用卡卡号的方法
    C#中Invoke的用法
  • 原文地址:https://www.cnblogs.com/thlzhf/p/3993765.html
Copyright © 2011-2022 走看看