zoukankan      html  css  js  c++  java
  • 迭代器与组合模式

    《headfirst设计模式》

    迭代器模式:

    提供一种方法顺序访问一个局和对象中的各个元素,而又不暴露其内部的表示。

    image

    (1)自定义迭代器interface。需要使用迭代器的类implements这个接口。

    interface Iterator

    {

    //需要有的最基本的两个操作

    Object next();

    boolean hasNest();

    //可选的

    void remove();

    }

    (2)java提供的迭代器接口java.util.Iterator

    ***********

    内部迭代器:由迭代器自己自己控制,自行在元素之间游走,因此必须告诉迭代器在游走的过程中要做些什么,也就是说,要将操作传入到迭代器。

    外部迭代器:客户端通过使用next()获得下一个元素。

    相比较,外部迭代器比内部迭代器更有弹性。

    迭代器取出元素并没有次序,只是依次取出所有元素,并不能根据取出先后次序判断元素大小次序。

    组合模式:

    允许将对象组合成树形结构来表现“整体/部分”层次结构。组合能够让客户以一致的方式处理个别对象以及组合对象。

    在实现组合模式是后需要根据需要平衡透明性和安全性。

    image

    组合迭代器(△)

    这里面的next和hasNest用到Stack来递归,这部分有点绕,看了半天,花图才明白。

    ////////////////////////下面代码记录下

    public class CompositeIterator implements Iterator {
        Stack stack = new Stack();//堆栈内每个元素都是一个迭代器
        public CompositeIterator(Iterator iterator) {
            stack.push(iterator);
        }
        public Object next() {
            if (hasNext()) {
                Iterator iterator = (Iterator) stack.peek();//查看栈顶元素,并没有弹出栈
                MenuComponent component = (MenuComponent) iterator.next();//取出栈顶元素下一个元素
                if (component instanceof Menu) {
                    stack.push(component.createIterator());
                }
                return component;
            } else {
                return null;
            }
        }
        public boolean hasNext() {
            if (stack.empty()) {
                return false;
            } else {
                Iterator iterator = (Iterator) stack.peek();
                if (!iterator.hasNext()) {
                    stack.pop();//此时的栈顶元素下面已经没有子节点或者子节点已经被遍历过了,就删除这个子节点
                    return hasNext();//然后递归插线下个栈顶元素
                } else {
                    return true;
                }
            }
        }
        public void remove() {
            throw new UnsupportedOperationException();
        }
    }

    *******

    这一章提出了一个新的设计原则:一个类应该只有一个引起变化的原因。

  • 相关阅读:
    Python3学习之路~8.5 SocketServer实现多并发
    Python3学习之路~8.4 利用socket实现文件传送+MD5校验
    [jzyzoj2021]lca模板题
    [BZOJ4542] [JZYZOJ2014][Hnoi2016] 大数(莫队+离散化)
    BZOJ3289[JZYZOJP2018]: Mato的文件管理 莫队+树状数组+离散化
    离散化的后续
    数据离散化 ( 以及 stl 中的 unique( ) 的用法 )+ bzoj3289:Mato的文件管理
    stl upper_bound()
    [BZOJ 3720][JZYZOJ 2016]gty的妹子树 强制在线 树分块/树套树
    所以学树分块的时候为什么要看vector啊sjb
  • 原文地址:https://www.cnblogs.com/growup/p/1988851.html
Copyright © 2011-2022 走看看