为了账号安全,请及时绑定邮箱和手机立即绑定

第 1 章 Iterator 模式 -- 逐个遍历

标签:
设计模式

webp

image.png

Iterator 模式:

1.概念:将循环变量 i 的作用抽象化、通用化后形成的模式;
2.用途:在数据集合中按照顺序遍历集合;
3.别名:迭代器;


webp

image.png

    /// <summary>
    /// 聚合
    /// </summary>
    public interface IAggregate
    {        /// <summary>
        /// 迭代器
        /// </summary>
        /// <returns></returns>
        IIterator Iterator();
    }
/// <summary>/// 迭代器/// </summary>public interface IIterator{    /// <summary>
    /// 是否包含下一个
    /// </summary>
    /// <returns></returns>
    bool HasNext();    /// <summary>
    /// 下一个
    /// </summary>
    /// <returns></returns>
    object Next();
}
    /// <summary>
    /// 书
    /// </summary>
    public class Book
    {
        /// <summary>
        /// 名称
        /// </summary>
        public string Name { get; set; }        public Book(string name)
        {
            Name = name;
        }
    }
/// <summary>/// 书架/// </summary>public class BookShelf : IAggregate
{    private readonly List<Book> _books;    public BookShelf()
    {
        _books = new List<Book>();
    }    /// <summary>
    /// 迭代器
    /// </summary>
    /// <returns></returns>
    public IIterator Iterator()
    {        return new BookShelfIterator(this);
    }    /// <summary>
    /// 获取图书
    /// </summary>
    /// <param name="index"></param>
    /// <returns></returns>
    public Book GetBookAt(int index)
    {        return _books[index];
    }    /// <summary>
    /// 添加图书
    /// </summary>
    /// <param name="book"></param>
    public void AppendBook(Book book)
    {
        _books.Add(book);
    }    /// <summary>
    /// 获取数量
    /// </summary>
    /// <returns></returns>
    public int GetCount()
    {        return _books.Count;
    }
}
    class Program
    {        static void Main(string[] args)
        {            var bookShelf = new BookShelf();
            bookShelf.AppendBook(new Book("Around the World in 80 Days"));
            bookShelf.AppendBook(new Book("Bible"));
            bookShelf.AppendBook(new Book("Cinderella"));
            bookShelf.AppendBook(new Book("Daddy-Long-Legs"));            var iterator = bookShelf.Iterator();            while (iterator.HasNext())
            {                var book = (Book) iterator.Next();
                Console.WriteLine(book.Name);
            }

            Console.Read();
        }
    }

角色梳理

IIterator 迭代器

负责定义按顺序逐个遍历元素的接口。

ConcreteIterator 具体的迭代器

负责实现 Iterator 接口。

IAggregate 聚合接口

负责定义创建 IIterator 接口。

ConcreteAggregate 具体的集合

负责实现 IAggregate 的接口。


webp

image.png

要点 & 思路

不管实现如何变化,都可以使用 IIterator

引入 IIterator 后可以将遍历与实现分离开来;
设计模式的作用就是帮助我们编写可服用的类。所谓“可复用”,就是指将类实现为“组件”,当一个组件发生改变时,不需要对其他的组件进行修改或是只需要很小的修改即可应对;

难以理解抽象类和接口

如果只使用具体的类来解决问题,很容易导致类之间的强耦合,这些类也难以作为组件被再次利用。为了弱化类之间的耦合,进而使得类更加容易作为组件被再次利用,我们需要引入抽象类和接口。
不要只使用具体类来编程,要有限使用抽象类和接口来编程。

相关模式

Visitor 模式

Iterator 模式是从集合中一个个取出元素进行遍历,但是并没有在 Iterator 接口中声明对取出的元素进行何种处理。Visitor 模式则是在遍历元素集合的过程中,对元素进行相同的处理。

Composite 模式

递归结构的模式。

Factory Method 模式

在创建迭代器时可能会使用工厂方法模式。



作者:oO反骨仔Oo
链接:https://www.jianshu.com/p/b78dab04463d


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消