【Java代码】 import Java.util.ArrayList; import java.util.List; (1) class AbstractFile{ protected String name; public void printName( ){System.out.println( name );} public abstract boolean addChild( AbstractFile file ); public abstract boolean removeChild( AbstractF ile file ); public abstract List getChildren( ); } class File extends AbstractFile{ public File( String name ){this.name=name;} public boolean addChild( AbstractFile file ){return false;} public boolean removeChild( AbstractFile file ){return false;} public List getChildren( ){return (2) ;} } class Folder extends AbstractFile{ private List childList; public Folder( String name ){ this.name=name; this.childList=new ArrayList( ); } public boolean addChild( AbstractFile file ) { return childList.add( file );} public boolean removeChild( AbstractFile file ){return childList.remove( file );} public (3) getChildren( ){return (4) ;} } public class Client{ public static void main( String[] args ){ //构造一个树形的文件/目录结构 AbstractFile rootFolder= new Folder( "c:\ " ); AbstractFile compositeFolder=new Folder( "composite" ); AbstractFile windowsFolder=new Folder( "windows" ); AbstractFile file=new File( "TestComposite.java" ); rootFolder.addChild( compositeFolder ) ; rootFolder.addChild( windowsFolder ); compositeFolder.addChild( file ) ; //打印目录文件树 printTree( rootFolder ); } private static void printTree( AbslractFile ifile ){ ifile.printName( ); List children=ifile.getChildreno: if( children = =null ) return; for ( AbstractFile ..file:children ) { (5) ; } } } 该程序运行后输出结果为: c: composite TestComposite.java Windows 参考答案:
这道题没有难度,基本上不了解组合模式也能写出。
已知某类库开发商提供了一套类库,类库中定义了Application类和document类,它们之间的 关系如图6-30所示,其中,Application 类表示应用程序自身,而document类则表示应用程序打开 的文档。Application类负责打开一个已有的以外部形式存储的文档,如一个文件,一旦从该文件中 读出信息后,它就由一个document对象表示 当开发一个具体的应用程序时,开发者需要分别创建自己的Application和document子类,例如图6-30中的类MyApplication和类Mydocument,并分别实现Application和document类中的某些方法。已知Application类中的opendocument方法采用了模板方法(Template Method)设计模式,该方法定义了打开文档的每一个主要步骤,如下所示: 1.首先检查文档是否能够被打开,若不能打开,则给出出错信息并返回; 2.创建文档对象; 3.通过文档对象打开文档; 4.通过文档对象读取文档信息; 5.将文档对象加入到Application的文档对象集合中。
【Java 代码】 abstract class document{ public void save( ){ } public void open(String docName){ } public void close( ){ } public abstract void read(String docName ); }; abstract class Appplication{ private Vector < (1) > docs; public boolean canOpendocument( String docName ){ } public void adddocument( document adocument ){ docs.add( (2) ); } public abstract document doCreatedocument( ); public void opendocument( String docName ){ if ( (3) ){ System.out.println( "文档无法打开!" ); return; } (4) adoc = (5) ; (6) ; (7) ; (8) ; } } 参考答案:
已知某企业的采购审批是分级进行的,即根据采购金额的不同由不同层次的主管人员来审 批,主任可以审批5万元以下(不包括5万元)的采购单,副董事长可以审批5万元至10万元(不包括 10万元)的采购单,董事长可以审批10万元至50万元(不包括50万元)的采购单,50万元及以上的 采购单就需要开会讨论决定。 采用责任链设计模式(Chain of Responsibility)对上述过程进行设计后得到的类图如图6- 33所示。 【Java代码】 class PurchaseRequest { public double Amount; // 一个采购的金额 public int Number; // 采购单编号 public String Purpose; // 采购目的 }; class Approver { // 审批者类 public Approver( ){ successor = null; } public void ProcessRequest( PurchaseRequest aRequest ){ if( successor != null ){ successor. (1) ; } } public void SetSuccessor( Approver aSuccesssor ){ successor = aSuccesssor; } private (2) successor; }; class Congress extends Approver { public void ProcessRequest( PurchaseRequest aRequest ){ if( aRequest.Amount>= 500000 ){ } else (3) .ProcessRequest( aRequest ); } }; class Director extends Approver { public void ProcessRequest( PurchaseRequest aRequest ){ } }; class President extends Approver { public void ProcessRequest( PurchaseRequest aRequest ){ } }; class VicePresident extends Approver { public void ProcessRequest( PurchaseRequest aRequest ){ } }; public class rs { public static void main( String[] args ) throws IOException { CongressMeeting = new Congress( ); VicePresidentSam = new VicePresident( ); DirectorLarry = new Director( ); PresidentTammy = new President( ); //构造责任链 Meeting.SetSuccessor( null ); Sam.SetSuccessor( (4) ); Tammy.SetSuccessor( (5) ); Larry.SetSuccessor( (6) ); // 构造一采购审批请求 PurchaseRequestaRequest = new PurchaseRequest( ); BufferedReader br = new BufferedReader( newInputStreamReader( System.in ) ); aRequest.Amount = Double.parseDouble( br.readLine( ) ); (7) .ProcessRequest( aRequest ); // 开始审批 return; } } 参考答案



