6.10 实例分析——宠物商店

1.设计要求

实现一个宠物商店,在宠物商店中可以有多种(由用户决定数量)宠物,试表示出此种关系,并要求可以根据宠物的关键字查找到相应的宠物信息。所需要的宠物信息自行设计。

2.程序分析

(1)本要求中提示宠物的信息可以自行设计,所以此时简单设计出3个属性:名字、颜色、年龄。

(2)宠物的类别很多,如猫、狗等都属于宠物,所以宠物应该是一个标准。

(3)在宠物商店中,只要是符合此宠物标准的就可以放进宠物商店之中。

(4)宠物商店中要保存多种宠物,则肯定应该是一个宠物的对象数组,宠物的个数由用户决定的话,则应该在创建宠物商店的时候,就分配好所能保存的宠物个数。

根据上面的分析,可以得出如图6-21所示的图形。

从图6-21中可以清楚地发现,宠物商店不管具体的宠物是哪一个,只要是宠物就可以放进去,所以此宠物的标准应该使用接口进行定义,每个具体的宠物都实现此接口,宠物商店与接口有关,可以得出如图6-22所示的类图关系。

图6-21 分析图

图6-22 类图

从图6-22中可知,制订出了宠物的标准之后,程序可以任意扩充具体的宠物,因为宠物商店只与宠物标准有关。

3.程序设计

代码:宠物接口—Pet.java

之后根据此接口定义出具体的子类。

代码:宠物猫—Cat.java

代码:宠物狗—Dog.java

此处只定义出了两种宠物,如果有更多的宠物,则只要实现Pet接口即可,下面开始定义宠物商店的操作类,在宠物商店中应该包含一个宠物接口的对象数组。

代码:宠物商店—PetShop.java

上面的查询代码可能会比较复杂一些,下面简单为读者介绍以上代码的思路。

(1)在此方法设计的时候秉着一个原则,即所有的内容交给被调用处输出,类中不要直接输出内容,所以本方法必须有一个返回值,因为查找出来的结果肯定是多个,所以返回值的类型定义为Pet[],表示返回一组查询到的宠物,所以方法名称设计如下:

(2)一个宠物商店中会有多个宠物,但是符合查询条件的宠物只有几个,所以要想返回一个对象数组,则必须要确定好此数组需要开辟的空间的大小才行,操作代码如下:

在上面的代码中,查询使用的是String类中的indexOf()方法,如果此方法的返回值不为-1,则表示已经找到了查询内容,因为在接口的定义中已经明确的定义了得到信息的操作,所以直接使用接口对象即可。

(3)为返回的对象数组开辟空间之后,下面就要把每一个符合条件的对象向数组中依次加入,所以还需要再进行一次循环,操作代码如下:

这样经过上面的3步之后,就可以把全部符合查询条件的内容查找出来,并放在返回的对象数组之中。

程序编写完成之后,下面对以上程序进行测试。

4.程序测试

代码:测试宠物商店—PetShopDemo.java

程序执行结果:

在上面的程序中,宠物商店里只能存放五种宠物,所以再加入第6种宠物的时候就无法再增加了,调用查询方法后返回的是一组宠物信息,所以直接定义一个print()方法进行内容的输出。