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();
        }
    }

    *******

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

  • 相关阅读:
    Oracle分页查询
    Oracle表空间
    Oracle中DBA常用操作
    数据库的约束
    数据库设计的三范式
    数据类型的比较 有四种情况
    github快速上手
    3D正方体做法
    animation-声明关键帧
    轮播图样式
  • 原文地址:https://www.cnblogs.com/growup/p/1988851.html
Copyright © 2011-2022 走看看