package com.javase.进阶;public interface FoodMenu {
// 西红柿炒鸡蛋void xiHongShiChaoJiDan();// 鱼香肉丝void yuXiangRouSi();
}
package com.javase.进阶;public class AmericaCooker implements FoodMenu {
// 实现菜单接口,就需要实现菜单中所有的方法public void xiHongShiChaoJiDan() {System.out.println("西餐师傅做的西红柿炒鸡蛋!太甜啦!");}public void yuXiangRouSi() {System.out.println("西餐师傅做的鱼香肉丝!太甜啦!");}
}
package com.javase.进阶;class ChinaCooker implements FoodMenu {
// 实现接口,需要实现接口中的所有方法public void xiHongShiChaoJiDan(){System.out.println("中餐师傅做的西红柿炒鸡蛋,河北口味!");}public void yuXiangRouSi() {System.out.println("中餐师傅做的鱼香肉丝,河北口味!");}
}
package com.javase.进阶;public class Customer {
// 顾客手中有一个菜单,符合" has a " 所以“菜单”应该是顾客的一种属性private FoodMenu foodMenu;
// 无参构造public Customer() {}// 有参构造public Customer(FoodMenu foodMenu) {this.foodMenu = foodMenu;}// set and get 方法public FoodMenu getFoodMenu() {return foodMenu;}public void setFoodMenu(FoodMenu foodMenu) {this.foodMenu = foodMenu;}// 顾客点菜的方法public void order(){
// 顾客需要先拿到菜单(getFoodMenu()),然后点菜(因为菜单中有xiHongShiChaoJiDan(),所以.xiHongShiChaoJiDan())
// 下行代码getFoodMenu()获取的是FoodMenu类型的引用,父类型引用在调用方法的时候,执行的是子类型重写后的方法getFoodMenu().xiHongShiChaoJiDan();
// 因为菜单里有yuXiangRouSi(),所以.yuXiangRouSi()getFoodMenu().yuXiangRouSi();}
}
package com.javase.进阶;public class FoodMenuText {public static void main(String[] args) {// 创建一个中餐师傅(此处使用多态,父类型引用指向子类型对象; 中餐师傅实现了菜单接口,FoodMenu就是父,ChinaCooker就是子)FoodMenu cooker1 = new ChinaCooker();
// 创建一个西餐师傅(此处使用多态,父类型引用指向子类型对象; 西餐师傅实现了菜单接口,FoodMenu就是父,AmericaCooker就是子)FoodMenu cooker2 = new AmericaCooker();
// 创建一个顾客,给顾客传入一个西餐师傅对象,该顾客点菜后吃到的就是西餐师傅做的菜
// Customer customer = new Customer(cooker2);
// 创建一个顾客,给顾客传入一个中餐师傅对象,该顾客点菜后吃到的就是中餐师傅做的菜Customer customer = new Customer(cooker1);
// 顾客点菜customer.order();}
}
/*
程序运行结果:中餐师傅做的西红柿炒鸡蛋,河北口味!
中餐师傅做的鱼香肉丝,河北口味!
*/