多态解析
最早学一个变量------>内存空间(小容器) 只有一个
后来学一个数组------>内存空间(小容器) 存储一组一样的数据类型
好处是在于堆内存中存储的地址连续 便于循环遍历
数组创建时必须指定长度 频繁的添加或删除元素 个数固定就很不方便
再后来学习如何描述类--->利用自己描述的类ArrayBox创建对象(小容器) 存储一组元素
长度对于使用者来讲是可变的 便于循环遍历(底层就是数组)
频繁的在ArrayBox中插入元素 从中间位置删除元素 性能不高
上次学习利用链式结构--->利用自己描述的类LinkedBox创建对象(小容器) 存储一组元素
长度对于使用者来讲是可变的 双向链表结构 (底层实现Node对象 节点)
更加适合于插入元素或删除元素
每一个node对象的地址不是连续 循环效率比较慢
代码示例:
为了便于用于使用Box--->定义一个规则----->定义一个接口
//为了将所有的box规则统一起来 让使用者用起来更加方便publicinterfaceBox{ publicbooleanadd(element);添加到末尾publicvoidadd(intindex,intelement); 在给定的位置中插入一个元素publicvoidaddAll(); 将给定的box中所有的元素添加至我们现在的box中publicintget(index); publicintremove(index); publicintsize(); }
有了box可以做统一的规则约束
每一个子类都实现同一个规则 用户使用起来很容易
如果按照上述的方式来实现 规则添加了新的方法 所有的子类都跟着添加新的方法
设计模式
适配器模式 Adapter
定义一个规则--->和尚 吃斋 念经 打坐 撞钟 习武
缺省适配器模式
publicabstractclassAbstractBoximplementsBox{ publicbooleanadd(element); publicvoidadd(intindex,intelement){//具体化//抛出自定义异常 } publicvoidaddAll(){//具体化//抛出自定义异常 } publicintget(index); publicintremove(index); publicintsize(); publicvoidrangeCheck(intindex){ if(index<0||index>=size){ 自定义的异常 } } }
publicclassArrayBoxextendsAbstractBox{ 属性用来存储真实数据elementDate[] 属性用来记录有效元素个数intsize; publicbooleanadd(element){ //1.确保数组内部容量//2.将element元素存入数组的最后位置 size++//3.返回一个true告知用户添加成功 } publicintget(index){ //1.检测index范围是否合法//2.将index位置的元素从数组中取出 并返回 } publicintremove(index){ //1.检测index范围是否合法//2.获取index位置上的元素----保留起来//3.从index开始至size-1位置 将后面元素逐一前移覆盖//4.最后有效的那个元素删掉 --size//5.保留起来的旧元素返回 } publicintsize(){ //return this.size; } }
//这是一个自定义的类型----节点publicclassNode{ Nodeprev; intitem; Nodenext; } publicclassLinkedBoxextendsAbstractBox{ 属性存储首节点first属性存储尾节点last属性存储有效元素的个数sizepublicbooleanadd(element){ //找一个人 将element添加在链表末尾//告知添加成功 } publicintget(index){ //检测index是否合法//找一个人 帮我们找到index位置的那个Node对象//将node中item数据返回 } publicintremove(index){ //检测index是否合法//找一个人 帮我们找到index位置的那个Node对象//找一个人 帮我们将node对象删除 将删掉node对象中的旧数据返回//将旧数据返回 } publicintsize(){ 返回有效元素的个数 } }