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