某动物园有一饲养员小李,每天需要给他负责饲养的狮子,猴子,鸽子喂食,请用一个过程来模拟这个过程
面向对象建模----1
三个动物对应三个类,所以新建Linon,Monkey,Bird,每个类定义一个eat()方法,表示吃饲养员喂养的食物
面向对象建模---2
定义一个饲养员类Feeder,其name表示名字,在类中定义三个方法,feedLion, feedMonkey, feedBird,其参数为三种动物的引用
版本一:
Lion.java
public class Lion { public void eat(){ System.out.println("Lion Eated"); } }
Bird.java
public class Bird { public void eat(){ System.out.println("Bird Eated"); } }
Monkey.java
public class Monkey { public void eat(){ System.out.println("Monkey Eated"); } }
Feeder.java
public class Feeder { public String name; public Feeder(String name){ this.name = name; } public void feedLion(Lion lion){ lion.eat(); } public void feedMonkey(Monkey monkey){ monkey.eat(); } public void feedBird(Bird bird){ bird.eat(); } }
TestFeed.java
public class TestFeed { public static void main(String[] args) { Feeder feeder = new Feeder("张三"); feeder.feedLion(new Lion()); for(int i = 0; i < 10; i++) feeder.feedMonkey(new Monkey()); for(int i = 0; i < 5; i++) feeder.feedBird(new Bird()); } }
版本一问题:
Lion,Monkey,Bird类中只有一个方法eat()
在Feeder中为Lion,Monkey,Bird均单独设一个方法,显得多余
版本二:
可以定义个抽象的Animal类,在其中定义一个抽象方法eet(),让三个子类继承,并且
实现该方法
Lion.java
public class Lion extends Animal{ public void eat(){ System.out.println("Lion Eated"); } }
Monkey.java Bird.java做类似修改,省略之。
Animal.java
public abstract class Animal { public abstract void eat(); }
public class Feeder { public String name; public Feeder(String name){ this.name = name; } public void feedAnimal(Animal animal){ animal.eat(); } }
TestFeed.java
public class TestFeed { public static void main(String[] args) { Feeder feeder = new Feeder("张三"); feeder.feedAnimal(new Lion()); for(int i = 0; i < 5; i++) feeder.feedAnimal(new Monkey()); for(int i = 0; i < 5; i++) feeder.feedAnimal(new Bird()); } }
Feeder的三个喂养方法合并为一个feedAnimal()方法,它可以接收一个类型为Animal的参数,而不是三个具体的动物类型
依据多态特性,feedAnimal方法可以接收任意一个派生自Animal类的子类对象
版本三:
让feedAnimal()方法可以处理 喂食一群动物的 操作
Feeder.java
public class Feeder { public String name; public Feeder(String name){ this.name = name; } //喂食一群动物 public void feedAnimal(Animal[] animal){ for (int i = 0; i < animal.length; i++) animal[i].eat(); } }TestFeed.java
public class TestFeed { public static void main(String[] args) { Feeder feeder = new Feeder("张三"); Animal[] animals = new Animal[16]; animals[0] = new Lion(); for(int i = 0; i < 10; i++) animals[i + 1] = new Monkey(); for(int i = 0; i < 5; i++) animals[11 + i] = new Bird(); feeder.feedAnimal(animals); } }版本三的问题:Animal数组长度必须限定,所以无法动态的增删动物个数
版本四:
修改feedAnimal方法,让其接收一个元素数目可变的对象容器
Feeder.java
import java.util.Vector; public class Feeder { public String name; public Feeder(String name){ this.name = name; } //喂食一群动物 //Vector是JDK中提供的一个对象集合,可以随时向其中加入或者删除元素 public void feedAnimal(Vector animals){ for(Animal an :animals) an.eat(); } }
TestFeed.java
import java.util.Vector; public class TestFeed { public static void main(String[] args) { Feeder feeder = new Feeder("张三"); Vectorans = new Vector (); ans.add(new Lion()); for(int i = 0; i < 10; i++) ans.add(new Monkey()); for(int i = 0; i < 5 ; i++) ans.add(new Bird()); feeder.feedAnimal(ans); } }
多态是面向对象的难点,很重要,多敲代码,多思考
以上例子来自:http://www.jinxuliang.com/resource/PPT/Show2/cbb41c18-24fc-4ec9-a358-37f99cc84650
感谢金旭亮老师。