- 浏览: 26179 次
- 性别:
- 来自: 武汉
-
最新评论
-
裴小星:
这种写法理解起来很费劲。我觉得还是直观感受比较重要。
里氏代换原则(Liskov Substitution Principle) -
mabusyao:
奇怪,代码引用在评论里面好像是失效的,我试试
public c ...
里氏代换原则(Liskov Substitution Principle) -
mabusyao:
有两个原则和里氏替换原则关系非常紧密。1. 开闭原则2. 依赖 ...
里氏代换原则(Liskov Substitution Principle)
迭代这个名词对于熟悉Java的人来说绝对不陌生。我们常常使用JDK提供的迭代接口进行java collection的遍历
1.迭代器角色定义了遍历的接口,但是没有规定由谁来控制迭代。在Java
collection的应用中,是由客户程序来控制遍历的进程,被称为外部迭代器;还有一种实现方式便是由迭代器自身来控制迭代,被称为内部迭代器。外部
迭代器要比内部迭代器灵活、强大,而且内部迭代器在java语言环境中,可用性很弱。
2.在迭代器模式中没有规定谁来实现遍历算法。好像理所当然的要在迭代器角色中实现。因为既便于一个容器上使用不同的遍历算法,也便于将一种
遍历算法应用于不同的容器。但是这样就破坏掉了容器的封装??容器角色就要公开自己的私有属性,在java中便意味着向其他类公开了自己的私有属性。
那我们把它放到容器角色里来实现好了。这样迭代器角色就被架空为仅仅存放一个遍历当前位置的功能。但是遍历算法便和特定的容器紧紧绑在一起了。
而在Java Collection的应用中,提供的具体迭代器角色是定义在容器角色中的内部类。这样便保护了容器的封装。但是同时容器也提供了遍历算法接口,你可以扩展自己的迭代器。
好了,我们来看下Java Collection中的迭代器是怎么实现的吧。
//迭代器角色,仅仅定义了遍历接口
public interface Iterator { boolean hasNext(); Object next(); void remove(); } //容器角色,这里以List为例。它也仅仅是一个接口,就不罗列出来了 //具体容器角色,便是实现了List接口的ArrayList等类。为了突出重点这里指罗列和迭代器相关的内容 //具体迭代器角色,它是以内部类的形式出来的。AbstractList是为了将各个具体容器角色的公共部分提取出来而存在的。 public abstract class AbstractList extends AbstractCollection implements List { …… //这个便是负责创建具体迭代器角色的工厂方法 public Iterator iterator() { return new Itr(); } //作为内部类的具体迭代器角色 private class Itr implements Iterator { int cursor = 0; int lastRet = -1; int expectedModCount = modCount; public boolean hasNext() { return cursor != size(); } public Object next() { checkForComodification(); try { Object next = get(cursor); lastRet = cursor++; return next; } catch(IndexOutOfBoundsException e) { checkForComodification(); throw new NoSuchElementException(); } } public void remove() { if (lastRet == -1) throw new IllegalStateException(); checkForComodification(); try { AbstractList.this.remove(lastRet); if (lastRet < cursor) cursor--; lastRet = -1; expectedModCount = modCount; } catch(IndexOutOfBoundsException e) { throw new ConcurrentModificationException(); } } final void checkForComodification() { if (modCount != expectedModCount) throw new ConcurrentModificationException(); } }
发表评论
-
Effective Java 学习笔记第25条 --- 谨慎设计方法的原型
2011-04-25 10:20 776谨慎选择方法的名字 选择易于理解的,并且与同一个包中的 ... -
Effective Java 学习笔记第24条 --- 需要时使用保护性拷贝
2011-04-25 09:53 969假设类的使用者会尽一切手段来破坏这个类的约束条件,在这样的前提 ... -
Effective Java 学习笔记第23条 --- 检查参数的有效性
2011-04-25 09:43 795非公有的方法我们应该用断言的方法来检查它的参数,而不是使用通常 ... -
Effective Java 学习笔记第19~22条 --- 关于C语言结构的替代方案
2011-04-25 09:33 734第19条 --- 用类代替结构 ... -
Effective Java 学习笔记第17条 --- 优先考虑静态成员类
2011-04-25 09:30 755嵌套类只为它的外围类提供服务。嵌套类分为四种:静态成员类、非静 ... -
Effective Java 学习笔记第16条 --- 接口只是被用于定义类型
2011-04-22 08:55 747接口只是用来定义一个类型,不要把接口用来做其他的事情(如在接口 ... -
Effective Java 学习笔记第15条 --- 接口优于抽象类
2011-04-22 08:54 846接口和抽象类的区别: 抽象类允许包含默写方法的实现,而接口 ... -
Effective Java 学习笔记第15条 --- 要么专门为继承而设计,并给出文档说明,要么禁止继承
2011-04-22 08:52 834对并没有文档说明的类进行继承是非常危险的,它的公有方法有可能被 ... -
Effective Java 学习笔记第14条 --- 复合优先于继承
2011-04-22 08:50 863实现代码重用最重要的办法就是继承,但是继承破坏了封装,导 ... -
Effective Java 学习笔记第13条 --- 支持非可变性
2011-04-22 08:48 767为了使一个类成为非可变类,要遵循下面五条规则: 不要提供任 ... -
Effective Java 学习笔记第12条 --- 使类和成员的可访问能力最小化
2011-04-22 08:43 703好的模块设计应该尽最大可能封装好自己的内部信息,这样可以把模块 ... -
Effective Java 学习笔记第11条 --- 考虑实现Comparable接口
2011-04-22 08:31 707compareTo方法是java.lang.Comparabl ... -
Effective Java 学习笔记第10条 --- 谨慎地改写clone
2011-04-21 12:16 1055一个对象要想被Clone, ... -
Effective Java 学习笔记第9条 --- 总是要改写toString()方法
2011-04-21 11:59 873在Object的toString方法返回的形式是Class的类 ... -
Effective Java 学习笔记第8条 --- 改写equals方法时必须覆盖hashCode方法
2011-04-21 11:58 1001这点必须切忌,不然在你和hash-based集合打交道的时候, ... -
Effective Java 学习笔记第7条 --- 在改写equals方法时请遵守通用约定
2011-04-21 11:53 862下列情况是不需要改写equals方法的: 同一个类的不 ... -
Effective Java 学习笔记第6条 --- 避免使用终结函数
2011-04-20 11:53 1164终结函数(finalizer)可以用来回收不可到达的对象,就是 ... -
Effective Java 学习笔记第5条 --- 消除过期的对象引用
2011-04-20 11:49 778垃圾回收器不会对“过期引用”(永远不会在被解除的引用 ... -
Effective Java 学习笔记第4条 --- 避免创建重复的对象
2011-04-20 11:39 744如果一个对象是非可变的,那么它在程序中上可以被重用的,如: ... -
Effective Java 学习笔记第3条 --- 通过私有的构造函数强化不可实例化的能力
2011-04-20 11:35 835在面向对象程序设计中,假如存在太多只有静态属性 ...
相关推荐
迭代器模式(IteratorPattern)是设计模式中的一种行为模式,它提供了一种顺序访问聚合对象元素的方法,同时又不暴露其底层表示。这种模式允许我们遍历集合对象的元素,而无需暴露其内部结构。在Java、C#等面向对象...
本文介绍使用AspectJ实现设计模式之迭代子模式,文章以一个购买商品的例子实现AspectJ版本的内禀迭代子。由于迭代子模式应用广泛,文章在此不再赘述模式的具体内容了,我使用具体的例子说明如何使用AspectJ来完成...
迭代模式是一种行为设计模式,它允许我们通过统一的接口遍历集合对象的元素,而无需暴露其底层表示。在Java、C#等面向对象语言中,迭代器模式被广泛使用,尤其是在集合类库中,如ArrayList、LinkedList等。下面我们...
迭代子模式(Iterator Pattern)是一种行为设计模式,它允许我们顺序访问聚合对象的元素,而无需暴露其底层表示。在Java中,迭代器模式广泛应用于集合框架,如List、Set和Map等接口的实现。 在Java中,迭代器模式的...
在这个主题中,我们主要探讨了如何利用组合模式(Composite Pattern)构建二叉树,并通过迭代器模式(Iterator Pattern)来实现对树的遍历,包括前序、中序和后序遍历。这些是设计模式中的经典应用,对于理解和掌握...
设计模式 的分类 总体来说设计模式分为三大类: 创建型模式(5): ...策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
创建型模式,共五种:工厂方法模式、抽象工厂模式、...行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
创建型模式,共五种:工厂方法模式、抽象工厂模式、...行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
java设计模式示例 创建型模式(5种):工厂方法模式,...行为型模式(11种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
分别为:抽象工厂模式、建造模式、工厂方法模式、原型模式、单例模式、外观模式、适配器模式、桥接模式、组合模式、装饰模式、享元模式、代理模式、命令模式、解释器模式、访问者模式、迭代子模式、中介者模式、备忘...
创建型模式,共五种:工厂方法模式、抽象工厂模式、...行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
总体来说设计模式分为三大类: ...行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式例子
总体来说设计模式分为三大类: 创建型模式,共五种:...行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
java的设计模式大体上分为三大类: ...行为型模式(11种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
C#版的23个设计模式完整DEMO,包括: ...行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
迭代子模式( Iterator ) 责任链模式( Chain of Responsibility ) 命令模式( Command ) 备忘录模式( Memento ) 状态模式( State ) 访问者模式( Visitor ) 中介者模式( Mediator ) 解释器模式( ...
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 其实还有两类:并发型模式和线程池模式。
总体来说设计模式分为三大类: ...行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 其实还有两类:并发型模式和线程池模式。