首先我们定义一个自己的Collection接口:
创建自己的ArrayList类并实现此接口
再创建自己的LinkedList类并实现MyCollection接口
现在两个类都创建好了,我们开始定义Iterator接口
在MyArrayList里创建一个内部类实现Iterator并封装,同时开放一个接口让别人获取此内部类的对象
MyLinkedList相同
打完收工;其实ArrayList和LinkedList源码的Iterator都是直接对底层的数组和链表做操作,不过我怕麻烦,所以直接把当前对象传了进去;
Iterator在设计模式里叫做迭代器模式,其主要定义为,提供一种可以访问容器种各个的方式,但又不暴露该容器的内部细节。这里内部细节的意思就是因为每个容器本身的数据结构不同,如ArrayList底层是一个数组,LinkedList底层则是链表,访问ArrayList的时候你可以使用for,但是如果需要遍历LinkedList则只能使用while。(我代码中之所以都是调用了get,单纯是因为怕麻烦,源码都是直接对数组和链表做的操作)
而Iterator给我们定义了一个访问容器内元素的一个规范,具体要怎么实现就看你自己,这样一来在别人访问某个容器中元素的时候就不必再先去了解一下此容器的内部细节,直接获得此容器的迭代器对象就行;这也是面向对象编程中让对象帮我们去做事情这种思想的直接体现;
在此次学习中,我学习到了两个点,一个便是统一规范的重要性,二个便是面向对象思想的更深入了解,也懂得了为什么说面向接口基于面向对象但高于面向对象;
下面是我在通过Iterator设计模式的学习上举一反三的发散式思考,抛却智商因素,这也是我感觉自己不管学什么都比别人更深更快,同样一个点我能看到面而很多人只能看到点的原因之一;
首先接口是一个规范,是对一个体某些行为的定义。而与接口的概念最容易混淆的便是抽象类,同样可以定义抽象方法,同样不能有实例,只是抽象类可以实现方法体,并且也拥有构造函数,它与子类的关系也是继承,但他们的区别难道仅仅在于代码级别的体现吗?
这里说下我的理解,所谓抽象类,应该是一个我们能想到的某个事物,只是它太笼统,抽象,不够具体,但我们知道它能大概干什么,具体怎么干。举一个例子,比如交通工具,这就很抽象了,交通工具可以是汽车,可以是飞机,但是它们都有一个共同点,那就是可以运送我们从一个地方到另一个地方。这个时候这种运送就是交通工具的共同行为,我们就可以将其、
抽象为一个接口,这个接口的功能就是运送能力。但是汽车是在地上跑的。飞机是在天上跑的,而且汽车和飞机还是太抽象了,汽车可能是大卡车,也可能是小轿车,而飞机也有可能是客机,也可能是直升飞机,它们的启动方式和本身的构造都不相同,所以汽车和飞机虽然我们知道它们的运送行为是一个在地上跑,一个在天上飞。但是它们的
底下的种类分支太多,所以汽车和飞机都只能定义为抽象类。在这个时候我们可以在抽象类中实现它们一个在地上跑,一个是在天上飞的方法,但具体怎么跑,怎么飞我们则要将其定义为抽象方法,然后让具体的卡车或者汽车或者直升机对象实现它,甚至我们可以在其中定义一些公有属性;这样一来我们就不用去关心每个具体的对象它们怎么跑怎么飞的内部细节,只需要创建具体交通工具对象的人去实现它,我们直接调用即可;下面是代码示例: