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();
}
}
/*
程序运行结果:中餐师傅做的西红柿炒鸡蛋,河北口味!
中餐师傅做的鱼香肉丝,河北口味!
*/