一个饭店中,顾客和厨师之间通过菜单进行沟通,也就是说菜单是一个接口。
在这个例程中,只需修改test类即可控制你想要的选择的厨师类别。
package restaurant;
public class RestaurantTest {
public static void main(String[] args) {
//Customer c = new Customer(); //调用空构造方法,没有给Menu menu赋值
//c.order(); //会触发空指针异常 Exception in thread "main" java.lang.NullPointerException
Customer customer = new Customer(new ChineseChef()); //customer指向Customer类
customer.order(); //customer引用调用了Customer类下的点菜 方法
System.out.println(customer.getMenu()); //restaurant.ChineseChef@4e50df2e getMenu()指向的是ChineseChef
customer.setMenu(new WestChef()); //更换厨师Menu menu = new WestChef(); customer的指向没变
customer.order();
}
}
package restaurant;
public class Customer {
private Menu menu; //Menu数据类型 调用的接口
public Customer() {
}
public Customer(Menu menu) {
this.menu = menu; //Menu menu = new ChineseChef(); 这里是给menu赋了ChineseChef的地址
}
public Menu getMenu() {
return menu;
}
public void setMenu(Menu menu) {
this.menu = menu;
}
public void order(){
menu.tamatoAndEggs(); //调用 选择的厨师所炒的菜
menu.vegetable();
}
}
package restaurant;
public class ChineseChef implements Menu{
@Override
public void vegetable() {
System.out.println("中餐师傅的炒青菜真好吃");
}
@Override
public void tamatoAndEggs() {
System.out.println("中餐师傅的西红柿炒鸡蛋很好吃");
}
}
package restaurant;
public class WestChef implements Menu{
@Override
public void tamatoAndEggs() {
System.out.println("西餐师傅的西红柿炒鸡蛋放黄油");
}
@Override
public void vegetable() {
System.out.println("西餐师傅的炒青菜炒的是西蓝花");
}
}
package restaurant;
interface Menu { //接口
void tamatoAndEggs();
void vegetable();
}