抽象的操纵[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好友分享! |
- ·上一篇文章:多重调派
- ·下一篇文章:用于原型成立的一个范式
- ·中查找“抽象的操纵”更多相关内容
- ·中查找“抽象的操纵”更多相关内容