菜单接口:FoodMenu.java
/* 接口:菜单,抽象的 */ public interface FoodMenu{ // 西红柿炒蛋 void shiZiChaoJiDan(); // 鱼香肉丝 void yuXiangRouSi(); }
实现者(美国橱子): AmericaCook.java
//西餐厨师 // 实现菜单上的菜 // 厨师是接口的实现者。 public class AmericaCook implements FoodMenu{ // 西红柿炒蛋 public void shiZiChaoJiDan(){ System.out.println("美国人做的西红柿炒鸡蛋!"); } // 鱼香肉丝 public void yuXiangRouSi(){ System.out.println("美国人做的鱼香肉丝!"); } }
实现者(中国厨师): ChinaCook.java
//中餐厨师 // 实现菜单上的菜 // 厨师是接口的实现者。 public class ChinaCook implements FoodMenu{ // 西红柿炒蛋 public void shiZiChaoJiDan(){ System.out.println("西红柿炒鸡蛋!河南口味!"); } // 鱼香肉丝 public void yuXiangRouSi(){ System.out.println("鱼香肉丝!湖南口味"); } }
调用者(顾客): Customer.java
// 顾客 public class Customer{ // 顾客手里有一个菜单 // Customer has a FoodMenu!(这句话什么意思:顾客有一个菜单) // 记住:以后凡是能够使用 has a 来描述的,统一以属性的方式存在。 // 实例变量,属性 // 面向抽象编程,面向接口编程。降低程序的耦合度,提高程序的扩展力。 private FoodMenu foodmenu; // 如果以下这样写,就表示写死了(焊接了。没有可插拔了。) // 中餐厨师 //ChinaCooker cc; // 西餐厨师 //AmericCooker ac public Customer(){ } public Customer(FoodMenu foodmenu){ this.foodmenu = foodmenu; } public void setFoodmenu(FoodMenu foodmenu){ this.foodmenu = foodmenu; } public FoodMenu getFoodmenu(){ return foodmenu; } // 提供一个点菜的方法 public void order(){ // 先拿到菜单才能点菜 // 调用get方法拿菜单。 //FoodMenu fm = this.getFoodMenu(); // 也可以不调用get方法,因为在本类中私有的属性是可以访问 foodmenu.shiZiChaoJiDan(); foodmenu.yuXiangRouSi(); } } /* Cat is a Animal,但凡满足is a的表示都可以设置为继承。 Customer has a FoodMenu,但凡是满足has a的表示都以属性的形式存在。 */
测试类: Test.java
public class Test{ public static void main(String[] args){ //创建厨师对象 //FoodMenu f = new AmericaCook(); FoodMenu f = new ChinaCook(); //创建顾客对象 Customer c = new Customer(f); //顾客点餐 c.order(); } }
运行结果(Dos窗口模式):