设计模式笔记之三(Iterator Pattern):

Iterator Pattern, 即迭代器模式,它让使用者通过接口循环访问容器中的元素,且不用了解底层的实体。

加入我们现在想访问微信和Line的用户,且打印出相关信息。


如大家所知,微信和Line属于不同公司,因此对用户列表的设计也有所不同。

假设微信用了LinkedList,Line用了数组,要打印用户列表,就必须分别重新实现PrintLinkedList 和PrintArray。

如果提供这样的接口给用户,是很蛋疼的事情。


为了方便起见,可以选用迭代器模式。

迭代器模式广泛用在OO设计中,比如在Java的Collections,提供了迭代访问List,Set的方法。

一下是微信(Wechat)和Line的例子来说明这一设计方案。


设计迭代器接口:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Learning.iterator
{
    public interface IIterator
    {
        string Next();
        bool HasNext();
    }
}

社交聊天迭代器接口:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Learning.iterator
{
    public interface ISocialNetwork
    {
        IIterator CreateIterator();
    }
}

微信和微信迭代器:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Learning.iterator
{
    public class WechatIterator : IIterator
    {
        private LinkedList<string> users;
        private int position;
        public WechatIterator(Wechat facebook) 
        {
            users = facebook.Users;
        }

        public string Next()
        {
            return users.ElementAt(position++);
        }

        public bool HasNext()
        {
            return position >= users.Count;
        }

    }
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Learning.iterator
{
    public class WechatIterator : IIterator
    {
        private LinkedList<string> users;
        private int position;
        public WechatIterator(Wechat facebook) 
        {
            users = facebook.Users;
        }

        public string Next()
        {
            return users.ElementAt(position++);
        }

        public bool HasNext()
        {
            return position >= users.Count;
        }

    }
}

Line和Line 迭代器

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Learning.iterator
{
    public class Line : ISocialNetwork
    {
        private string[] users;
        public Line() 
        {
            users = new[] { "kathy", "lori", "krist" };
        }

        public string[] Users { get { return users; } }

        public IIterator CreateIterator()
        {
            return new LineIterator(this);
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Learning.iterator
{
    public class LineIterator : IIterator
    {
        private string[] users;
        private int position;
        public LineIterator(Line twitter) 
        {
            users = twitter.Users;
            position = 0;
        }

        public string Next()
        {
            return users[position++];
        }

        public bool HasNext()
        {
            return position >= users.Length;
        }

    }
}


测试:

public static void PrintIterator(IIterator iterator)
        {
            while(! iterator.HasNext())
            {
                Console.WriteLine(iterator.Next());
            }
        }

        static void Main(string[] args)
        {
            IIterator facebook = new Wechat().CreateIterator();
            IIterator twitter = new Line().CreateIterator();
            Console.WriteLine("Wechat users:");
            PrintIterator(facebook);
            Console.WriteLine("Line ussers:");
            PrintIterator(twitter);
            
           
        }

输出:

Wechat users:
jason
chris
Line ussers:
kathy
lori
krist



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值