美文网首页Java设计模式设计模式
第 1 章 Iterator 模式 -- 逐个遍历

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

作者: oO反骨仔Oo | 来源:发表于2018-08-30 23:52 被阅读9次
    image.png

    Iterator 模式:

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


    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 的接口。


    image.png

    要点 & 思路

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

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

    难以理解抽象类和接口

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

    相关模式

    Visitor 模式

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

    Composite 模式

    递归结构的模式。

    Factory Method 模式

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

    《图解设计模式》

    相关文章

      网友评论

        本文标题:第 1 章 Iterator 模式 -- 逐个遍历

        本文链接:https://www.haomeiwen.com/subject/mjjjwftx.html