多态解析:
最早学一个变量------>内存空间(小容器) 只有一个
后来学一个数组------>内存空间(小容器) 存储一组一样的数据类型
好处是在于堆内存中存储的地址连续 便于循环遍历
数组创建时必须指定长度 频繁的添加或删除元素 个数固定就很不方便
再后来学习如何描述类--->利用自己描述的类 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 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 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 class Node{
Node prev;
int item;
Node next;
}
public class LinkedBox extends AbstractBox{
属性存储首节点first
属性存储尾节点last
属性存储有效元素的个数size
public 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(){
返回有效元素的个数
}
}
复制代码
评论