一.
程序设计目标我们组写了个简单的水果生产程序,描述农场种植水果的过程,旨在通过此次设计更进一步了解工程设计模式,加强编程的结构化能力。开发环境:JDK1.5开发工具:JBuilder2006二.程序设计介绍1.程序结构我们组为一个水果公司写了个简单的生产程序,该公司专门向市场销售各类水果。我们为程序建立了一个名为farm的工程,程序结构比较简单,总共有7个类,并且都放在一个默认的包中。其层次结构可从下图体现出来:
对各个类的说明:Fruit类:水果接口,实现水果方法Apple类:苹果类,实现Fruit接口Grape类:葡萄类,实现Fruit接口Strawberry类:草莓类,实现Fruit接口FruitGardener类:园丁类,可种植各种水果BadFruitException类:要种植的水果不在公司经营的水果范围之内,抛出种植异常PlantFruit类:实现main()方法2.程序设计步骤在这个
系统里需要描述下列的水果:葡萄Grape草莓Strawberry苹果Apple
水果与其他的植物有很大的不同,就是水果最终是可以采摘食用的。那么一个自然的作法就是建立一个各种水果都适用的接口,以便与农场里的其他植物区分开。如下图所示。水果接口规定出所有的水果必须实现的接口,包括任何水果类必须具备的方法:种植plant(),生长grow()以及收获harvest()。接口Fruit的类图如下所示。
这个水果接口的
源代码如下所示。代码清单1:接口Fruit的源代码publicinterfaceFruit{//生长voidgrow();//收获voidharvest();//种植voidplant();}描述苹果的Apple类的源代码的类图如下所示。Apple类是水果类的一种,因此它实现了水果接口所声明的所有方法。另外,由于苹果是多年生植物,因此多出一个treeAge性质,描述苹果树的树龄。下面是这个苹果类的源代码。代码清单2:类Apple的源代码publicclassAppleimplementsFruit{privateinttreeAge;//生长publicvoidgrow(){
log("Appleisgrowing...");}//收获publicvoidharvest(){log("Applehasbeenharvested.");}//种植publicvoidplant(){log("Applehasbeenplanted.");}//辅助方法publicstaticvoidlog(Stringmsg){System.out.println(msg);}//树龄的取值方法publicintgetTreeAge(){returntreeAge;}//树龄的赋值方法publicvoidsetTreeAge(inttreeAge){this.treeAge=treeAge;}}
同样,Grape类是水果类的一种,也实现了Fruit接口所声明的所有的方法。但由于葡萄分有籽和无籽两种,因此,比通常的水果多出一个seedless性质,如下图所示。
葡萄类的源代码如下所示。可以看出,Grape类同样实现了水果接口,从而是水果类型的一种子类型。代码清单3:类Grape的源代码publicclassGrapeimplementsFruit{privatebooleanseedless;//生长publicvoidgrow(){log("Grapeisgrowing...");}//收获publicvoidharvest(){log("Grapehasbeenharvested.");}//种植publicvoidplant(){log("Grapehasbeenplanted.");}//辅助方法publicstaticvoidlog(Stringmsg){System.out.println(msg);
}//有无籽的取值方法publicbooleangetSeedless(){returnseedless;}//有无籽的赋值方法publicvoidsetSeedless(booleanseedless){this.seedless=seedless;}}下图所示是Strawberry类的类图。
Strawberry类实现了Fruit接口,因此,也是水果类型的子类型,其源代码如下所示。代码清单4:类Strawberry的源代码publicclassStrawberryimplementsFruit{//生长publicvoidgrow(){log("Strawberryisgrowing...");}//收获publicvoidharvest(){log("Strawberryhasbeenharvested.");
}//种植publicvoidplant(){log("Strawberryhasbeenplanted.");}//辅助方法publicstaticvoidlog(Stringmsg){System.out.println(msg);}}农场的园丁也是系统的一部分,自然要由一个合适的类来代表。这个类就FruitGardener类,其结构由下面的类图描述。
FruitGardener类会根据客户端的要求,创建出不同的水果对象,比如苹果(Apple),葡萄(Grape)或草莓(Strawberry)的实例。而如果接到不合法的要求,FruitGardener类会抛出BadFruitException异常,如下图所示。