当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:16:00  来源:本站整理

抽象的操纵[Java编程]

赞助商链接



  本文“抽象的操纵[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

走到这一步,接下来该考虑一下计划筹划剩下的部份了——在那边利用类?既然归类到垃圾箱的办法非常不雅且过于表露,为什么不断绝那个历程,把它躲藏到一个类里呢?这就是闻名的“假如必须做不雅的事情,至少应将其本地化到一个类里”法则.看起来就象下面这样:

目前,只要一种新范例的Trash加入办法,对TrashSorter对象的初始化就必须变更.可以想象,TrashSorter类看起来应当象下面这个模样:
class TrashSorter extends Vector {
void sort(Trash t) { /* ... */ }
}
也就是说,TrashSorter是由一系列句柄构成的Vector(系列),而那些句柄指向的又是由Trash句柄构成的Vector;操纵addElement(),可以安装新的TrashSorter,以下所示:
TrashSorter ts = new TrashSorter();
ts.addElement(new Vector());
但是目前,sort()却成为一个问题.用静态方法编码的办法若何对付一种新范例加入的事实呢?为办理这个问题,必须从sort()里将范例信息删除,使其需求做的全部事情就是调用一个通用办法,用它照料触及范例处理的全部细节.这当然是对一个动态绑定办法举行描写的另一种方法.所以sort()会在序列中简单地遍历,并为每个Vector都调用一个动态绑定办法.由于这个办法的任务是汇集它感爱好的垃圾片,所以称之为grab(Trash).构造目前变成了下面这样:

此中,TrashSorter需求调用每个grab()办法;然后按照当前Vector包容的是什么范例,会得到一个差别的后果.也就是说,Vector必须留神自己包容的范例.办理这个问题的传统办法是成立一个底子“Trash bin”(垃圾筒)类,并为但愿包容的每个差别的范例都担当一个新的衍生类.若Java有一个参数化的范例机制,那就大概是最直接的办法.但关于这种机制应当为我们构建的各个类,我们不该该举行麻烦的手工编码,今后的“察看”方法供应了一种更好的编码方法.
OOP计划一条基本的原则是“为状况的改变利用数据成员,为行为的改变利用多性形”.关于包容Paper(纸张)的Vector,以及包容Glass(玻璃)的Vector,大家最开始大概会认为辨别用于它们的grab()办法必定会产生差别的行为.但具体若何却完好取决于范例,而不是其他什么东西.可将其注释成一种差别的状况,并且由于Java有一个类可表示范例(Class),所以可用它判断特定的Tbin要包容什么范例的Trash.
用于Tbin的构建器要求我们为其传送自己挑选的一个Class.这样做可奉告Vector它但愿包容的是什么范例.随后,grab()办法用Class BinType和RTTI来查抄我们传送给它的Trash对象能否与它但愿汇集的范例符合.
下面列出完好的办理筹划.设定为注释的编号(如*1*)便于大家对比程序背面列出的阐明.

//: RecycleB.java
// Adding more objects to the recycling problem
package c16.recycleb;
import c16.trash.*;
import java.util.*;

// A vector that admits only the right type:
class Tbin extends Vector {
  Class binType;
  Tbin(Class binType) { 
    this.binType = binType; 
  }
  boolean grab(Trash t) {
    // Comparing class types:
    if(t.getClass().equals(binType)) {
      addElement(t);
      return true; // Object grabbed
    }
    return false; // Object not grabbed
  }
}

class TbinList extends Vector { //(*1*)
  boolean sort(Trash t) {
    Enumeration e = elements();
    while(e.hasMoreElements()) {
      Tbin bin = (Tbin)e.nextElement();
      if(bin.grab(t)) return true;
    }
    return false; // bin not found for t
  }
  void sortBin(Tbin bin) { // (*2*)
    Enumeration e = bin.elements();
    while(e.hasMoreElements())
      if(!sort((Trash)e.nextElement()))
        System.out.println("Bin not found");
  }
}

public class RecycleB {
  static Tbin bin = new Tbin(Trash.class);
  public static void main(String[] args) {
    // Fill up the Trash bin:
    ParseTrash.fillBin("Trash.dat", bin);

    TbinList trashBins = new TbinList();
    trashBins.addElement(
      new Tbin(Aluminum.class));
    trashBins.addElement(
      new Tbin(Paper.class));
    trashBins.addElement(
      new Tbin(Glass.class));
    // add one line here: (*3*)
    trashBins.addElement(
      new Tbin(Cardboard.class));

    trashBins.sortBin(bin); // (*4*)

    Enumeration e = trashBins.elements();
    while(e.hasMoreElements()) {
      Tbin b = (Tbin)e.nextElement();
      Trash.sumValue(b);
    }
    Trash.sumValue(bin);
  }
} ///:~

(1) TbinList包容一系列Tbin句柄,所以在查找与我们传送给它的Trash对象符合的情形时,sort()能通过Tbin担当.
(2) sortBin()答应我们将一个完好的Tbin传送进去,并且它会在Tbin里遍历,挑选出每种Trash,并将其归类到特定的Tbin中.请注意这些代码的通用性:新范例加入时,它本身不需求任何窜改.只要新范例加入(或发生其他事件)时大量代码都不需求改变,就表明我们计划的是一个简单扩大的系统.
(3) 目前可以领会增添新范例有多么简单了.为支持增添,只需求窜改几行代码.如确切有必要,乃至可以进一步地改良计划,使更多的代码都保持“固定”.
(4) 一个办法调用使bin的内容归类到对应的、特定范例的垃圾筒里.
  以上是“抽象的操纵[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • 抽象的操纵
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .