zoukankan      html  css  js  c++  java
  • 行为模式

    目的:提供一种方法,以某种方式遍历对象中的各个元素,避免暴露该对象的内部表示
    关键思想:把在元素之间游走的责任交给迭代器,而不是聚合对象
    优点:
        1. 对于一个聚合对象,可以方便地支持多种迭代器(Map 的 keyIterator 和 valueIterator,正向遍历,反向遍历),在同一个聚合上可以有多个遍历(每次getIterator都会获取到一个迭代器);
        2. 把迭代功能从聚合类抽出,交由迭代器实现遍历功能,降低聚合类的复杂性;
        3. 遍历过程封装性良好,用户只需要知道迭代器就可以遍历,对于遍历算法的实现不需要关心;
        4. 新增聚合类和迭代器都很方便,只需要增加,不需要修改;
    应用场景:遍历聚合对象
     
    实现方式:

     
    举个例子:
     
    Iterator 可以作为 Container 的内部类
     
    Iternator 的具体实现保存了遍历所在位置,每次调用 getIterator时,都会产生一个新的迭代器,该迭代器存放了当前迭代位置,避免了多线程同时遍历的影响
     
    线程安全问题

    提到遍历,不得不想到线程安全的问题,迭代器和集合是共生死的,一般迭代器对象都会持有一个集合对象的引用。
    在遍历过程中的插入和删除操作都可能造成线程安全问题,甚至是死锁,所以设计迭代器时,有下面几个点可以考虑
     
    (0)每次获取迭代器时,如果可以,最好提供一个新的迭代器,每个线程的迭代器持有不同的迭代位置
    (1)有些迭代器提供了remove的功能,而JDK里默认是禁掉的,直接抛异常,如果打开的话,可以使用模数 modCount fail fast 机制
            在 next remove first 等等具体读写操作时,可以用模数保证当前集合对象没有被其他线程修改,如果模数不同,直接抛出异常
    (2)CopyOnWrite iterator
     
    JDK实现

    各种集合都提供迭代器,甚至不止一类迭代器
     
    比如 AbstractList,遍历时采用了 fail fast 机制, 提供了Itr 和 ListItr
     
    interface Collection extends Iterable
    interface set extends Collection
  • 相关阅读:
    input 标签取消readOnly属性
    python selenium 跑脚本的时候按钮无法点击的解决办法
    Python Selenium 调用IE浏览器失败Unexpected error launching Internet Explorer解决方法
    转载--Python random模块(获取随机数)常用方法和使用例子
    转载--python selenium实现文件、图片上传
    ieDriver启动IE浏览器显示This is the initial start page for the WebDriver server的解决办法
    自动化测试用例设计学习心得总结
    关于selene安装插件ide不能识别插件的问题解决办法
    cmd 启动mysql
    最大子序列
  • 原文地址:https://www.cnblogs.com/43726581Gavin/p/9048481.html
Copyright © 2011-2022 走看看