阿里云【名师课堂】Java面向对象开发106:【第05个代码模型】综合案例:宠物商店
106:【第05个代码模型】综合案例:宠物商店
需求:
- 建立一家宠物商店,店里可以进行宠物的上架、下架、关键字查询。只要求描述出程序的关系。
- 宠物的属性:名字、年龄、毛色。
分析:
- 一家宠物商店会有多种宠物,按照设计表关系来说属于一对多关系映射。
- 宠物商店是一,宠物是多,那么问题来了,宠物也分很多种,怎么办?
- 宠物应该有自己的标准(猫、狗、鱼等),不符合标准的不是宠物(盆栽、奶茶等)。因此宠物应该是一个接口,猫、狗、鱼等是具体实现、是子类。
- 既然一家宠物商店需要描述多种宠物,而数量又不固定,要使用到链表类,通过链表存放多个信息。
- 所谓下架操作,就是链表中的删除,而删除操作需要
equals()
的支持。
0、编写Link类
Link类还是第105节讲解的简单Link类。详情参见:阿里云【名师课堂】Java面向对象开发97 ~ 105:链表。
1、建立宠物标准(接口)
接口只关心如何取得数据。
interface IPet { // 定义宠物标准
public String getName() ;
public int getAge() ;
public String getColor() ;
}
2、定义宠物商店类
对于宠物商店,只关注宠物的标准,而不关心具体是哪种宠物
class Shop {
private Link pets = new Link() ; // 开辟一个链表,保存多个宠物
public void add(IPet pet) { // 不关心是哪个宠物(子类),只关心“宠物”这个概念
this.pets.add(pet) ; // 上架就是向链表中保存数据
}
public void delete(IPet pet) {
this.pets.remove(pet) ; // 下架就是从链表中删除数据
}
public Link getPets(IPet pet) { // 取得全部宠物
return this.pets ; // 上架就是向链表中保存数据
}
public Link search(String keyWord) { // 关键字查找
Link results = new Link() ; // 查询到的结果一定是多个宠物,所以返回值是Link类
Object [] data = this.pets.toArray() ;
for (int x = 0 ; x < data.length ; x++) {
IPet pet = (IPet)data[x] ; // 只有转型成Pet类才可以调用接口中的三个属性
if (pet.getName().contains(keyWord) || pet.getColor().contains(keyWord)) {
results.add(pet) ;
}
}
return results ;
}
}
3、定义宠物狗
class DogImpl implements IPet {
private String name ;
private int age ;
private String color ;
public DogImpl(String name, int age, String color) { // 构造
this.name = name ;
this.age = age ;
this.color = color ;
}
public String getName() { // 接口方法覆写
return this.name ;
}
public int getAge() { // 接口方法覆写
return this.age ;
}
public String getColor() { // 接口方法覆写
return this.color ;
}
public boolean equals(Object obj) { // 覆写equals类
if (obj == null) {
return false ;
}
if (this == obj) {
return true ;
}
if (!(obj instanceof DogImpl)) {
return false ;
}
DogImpl dog = (DogImpl)obj ;
return this.name.equals(dog.name) && this.age == dog.age && this.color.equals(dog.color) ;
}
public String toString() {
return "【狗】名字:" + this.name + ",年龄:" + this.age + ",毛色:" + this.color ;
}
}
3、定义宠物猫
class CatImpl implements IPet {
private String name ;
private int age ;
private String color ;
public CatImpl(String name, int age, String color) { // 构造
this.name = name ;
this.age = age ;
this.color = color ;
}
public String getName() { // 接口方法覆写
return this.name ;
}
public int getAge() { // 接口方法覆写
return this.age ;
}
public String getColor() { // 接口方法覆写
return this.color ;
}
public boolean equals(Object obj) { // 覆写equals类
if (obj == null) {
return false ;
}
if (this == obj) {
return true ;
}
if (!(obj instanceof CatImpl)) {
return false ;
}
CatImpl cat = (CatImpl)obj ;
return this.name.equals(cat.name) && this.age == cat.age && this.color.equals(cat.color) ;
}
public String toString() {
return "【猫】名字:" + this.name + ",年龄:" + this.age + ",毛色:" + this.color ;
}
}
4、编写测试程序
public class PetShop {
public static void main(String args[]) throws Exception {
Shop petshop = new Shop() ;
petshop.add(new DogImpl("卡斯罗", 2, "黑色")) ;
petshop.add(new DogImpl("金毛", 4, "黄色")) ;
petshop.add(new DogImpl("阿拉斯加", 3, "黑白")) ;
petshop.add(new DogImpl("柴犬", 3, "黄白")) ;
petshop.add(new CatImpl("暹罗猫", 1, "小黑脸")) ;
petshop.add(new CatImpl("斯芬克斯猫", 1, "无毛")) ;
petshop.add(new CatImpl("加菲猫", 1, "黄色")) ;
Link all = petshop.search("黑") ;
Object[] result = all.toArray() ;
for (int i = 0 ; i < result.length ; i++) {
System.out.println(result[i]) ;
}
System.out.println("==========================") ;
petshop.delete(new DogImpl("卡斯罗", 2, "黑色")) ;
Link allA = petshop.search("黑") ;
Object[] resultA = allA.toArray() ;
for (int i = 0 ; i < resultA.length ; i++) {
System.out.println(resultA[i]) ;
}
}
}
完成代码:https://github.com/colderThyKiss/LinkedList.git中的PetShop.java
。
总结
实际上这种形式的代码在生活中处处可见:
- 公园里有多种绿植;
- 动物园有多种动物;
- 衣柜中有多种衣服;
类比于这个宠物商店的示例代码,记住:以后在进行代码开发的过程中一切都以接口设计为主。
目前还是不适应博客园的界面,等学成了再回归吧,对我来说当下还是csdn比较方便快捷:https://blog.csdn.net/weixin_43624945