0、介绍
给一个背景:一个pizza订购项目,pizza本身的种类要便于扩展和维护,那么种类很多、制作过程也不少、还要完成订购的功能。
按照一般的思路,类图设计如下:
其中:
- Pizza类按照面向对象的设计思路,制作过程对应的方法在其中实现;
- 由于需要不同的类型 Pizza,而在 prepare 步骤不同,所以 Pizza 做成抽象类,而两个不同类型的 Pizza 去继承 Pizza 类;
- 还需要一个的 OrderPizza 类,接受预定类型,完成对应的pizza类订购操作;
- 然后提供一个入口 PizzaStore 去调用 OrderPizza 类,相当于客户端。
代码如下:
/*
* Pizza抽象类,让其他的继承
*/
public abstract class Pizza {
protected String name;//pizza名
//不同pizza准备不同,所以留给实现类去实现
public abstract void prepare();
public void bake(){
System.out.println(name + " baking");
}
public void cut(){
System.out.println(name + " cutting");
}
public void box(){
System.out.println(name + " boxing");
}
public void setName(String name){
this.name = name;
}
}
/*
* 奶酪pizza
*/
public class CheesePizza extends Pizza {
@Override
public void prepare() {
System.out.println("制作奶酪pizza准备材料ing");
}
}
/*
* 希腊pizza
*/
public class GreekPizza extends Pizza {
@Override
public void prepare() {
System.out.println("给希腊pizza准备原材料ing");
}
}
/*
* pizza订购类
*/
public class OrderPizza {
//获取pizza订单
private String getType(){
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("input pizza type");
String type = br.readLine();
return type;
}catch (IOException e){
e.printStackTrace();
return "";
}
}
//构造器
public OrderPizza() {
Pizza pizza = null;
String orderType;//订购类型
do {
orderType = getType();
if (orderType.equals(