多态解析:
首先学习一个变量------>只有一个内存空间(小容器)
后来学了一个数组------>存储空间(小容器)存储一组相同类型的数据
其优点是堆内存中连续存储的地址 便于循环遍历
创建数组时,必须指定长度 元素的频繁添加或删除 固定个数很不方便
后来,我学会了如何描述类别--->用自己描述的ArrayBox创建对象(小容器)存储一组元素
对用户来说,长度是可变的 便于循环遍历(底层是数组)
元素经常插入ArrayBox 删除元素从中间位置 性能不高
上次学习使用链式结构--->用自己描述的类LinkedBox创建对象(小容器)存储一组元素
对用户来说,长度是可变的 双向链表结构 ((底层实现Node对象 节点)
更适合插入元素或删除元素
每个node对象的地址不是连续的 循环效率相对较慢
为了方便使用Box--->定义一个规则----->定义接口
///统一所有box规则 public使用起来更方便 interface Box{ public boolean add(element);添加到末尾 public void add(int index,int element); 在给定位置插入一个元素 public void addAll(); 在我们现在的box中添加给定box中的所有元素 public int get(index); public int remove(index); public int size();
有了box,可以做统一的规则约束
每个子类都实现相同的规则 用户很容易使用
按照上述方法实现的 规则增加了新的方法 所有子类都遵循添加新方法
设计模式适配器模式 Adapter
定义一个规则--->和尚 吃斋 念经 打坐 撞钟 习武
缺乏适配器模式
public abstract class AbstractBox implements Box{ public boolean add(element); public void add(int index,int element){//具体化 //抛出自定义异常 }
public class ArrayBox extends AbstractBox用于存储真实数据elementdate[]用于记录有效元素个数 int size;public boolean add(element){//1.确保数组内部容量//2.将element元素存储在数组的最后位置 size++//3.返回true通知用户添加成功}public int get(index){/1.检测index的范围是否合法//2.从数组中取出index位置的元素 并返回}public int remove(index){//1.检测index的范围是否合法//2.获取index位置上的元素-保留//3.从index到size-1位置 将后面的元素逐一前移覆盖//4。删除最后有效的元素 --size//5.保留的旧元素返回}public int size(){//return this.size;}} public void addAll(){//具体化 //抛出自定义异常 } public int get(index); public int remove(index); public int size(); public void rangeCheck(int index){ if(index<0 || index>=size){ 异常的自定义 } }}
///这是一种自定义类型-节点public class Node{Node prev;int item;Node next;}public class LinkedBox extends AbstractBox{属性存储首节点first属性存储尾节点last属性存储有效元素的sizepublic boolean add(element){//找人 将element添加到链表末尾//通知添加成功}public int get(index)///检测index是否合法//找个人 帮助我们找到index位置的Node对象///返回node中的item数据}public int remove(index)///检测index是否合法//找个人 帮助我们找到index位置的Node对象///找到一个人 帮助我们删除node对象 返回node对象中删除的旧数据//返回旧数据}public int size(){返回有效元素的数量}