设计Collection

从概念上Set是序列,数据不能重复。但是从实现的角度,Set底层基于Map实现更容易,因为map就是key不重复的。说白了,Set是Map的一层马甲。
这里不进行详细讲解了。
至此,我们介绍完了线性结构,ArrayList, LinkedList, Stack, Queue,Set, HashMap。事实上我们可以试着做一个共同的线性结构基础类,然后让这些类都继承它。
试着设计类层次:
Collection,对象的集合
   List:元素按进入先后有序保存,可重复
       LinkedList 链表, 插入删除效率高
       ArrayList  数组, 随机访问效率高
       Stack,实现栈结构
   Set: 不可重复,无次序
HashMap,键值对的集合

我们可以在Collection中规定一些最基本最常规的方法,如:
boolean    add(E e)
保证集合中包含此元素
boolean    addAll(Collection c)
将给定集合中的全部元素加到本集合中.
void    clear()
从本集合中删除全部元素
boolean    contains(Object o)
如果本集合中包含此元素返回真
boolean    containsAll(Collection c)
如果本集合中包含给定的集合返回真
boolean    isEmpty()
如果本集合中不包含任何元素返回真
Iterator    iterator()
返回指向集合中所有元素的迭代器
boolean    remove(Object o)
删除集合中给定的元素
boolean    removeAll(Collection c)
删除集合中所有包含在给定集合中的元素
int    sizeof()
返回集合中元素的个数
Object[]    toArray()
返回一个数组包含几何中全部的元素
这些基本的方法大体就是增加移除清空查找获取大小判断是否为空转成数组,拿到迭代器等。这确实是任何一个“线性序列”都应该有的。
实际上设计这么一个容器体系是很困难的工作,要在许多不同的矛盾的需求之间取舍和折衷,即使大师设计的容器框架也有很多不足。
类实现有几个基本原则要注意:
1、单一职责原则SRP(Single Responsibility Principle)
类的功能要单一,不能包罗万象。抓住核心需求,刚好实现到满足它为止。增一分则太多,减一分则太少。
2、开闭原则OCP(Open-Close Principle)
一个模块对于扩展是开放的,对于修改是封闭的。
3、里式替换原则LSP(the Liskov Substitution Principle LSP)
子类可以替换父类出现在父类能够出现的任何地方。
4、依赖倒置原则DIP(the Dependency Inversion Principle DIP)
高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。

你可以挑战一下自己,独立设计这么一个体系。