我家小餐馆
github地址:
https://github.com/zuojingang/common-tools-intergrated/blob/develop/src/main/java/pers/zuo/component/restaurant/Kitchen.java
食谱接口
package pers.zuo.component.restaurant.meal;
/**
* @author zuojingang
* @Title: IMeal
* @Description: 餐:炒河粉,炒面
* @date 2019-09-11 16:08
*/
public interface IMeal {
/**
* 描述
* @return
*/
String getDescription();
/**
* 价钱
* @return
*/
double cost();
}
炒面
package pers.zuo.component.restaurant.meal;
/**
* @author zuojingang
* @Title: Noodles
* @Description: 炒面
* @date 2019-09-11 17:09
*/
public class Noodles implements IMeal {
@Override
public String getDescription() {
return "炒面";
}
@Override
public double cost() {
return 8.0;
}
}
炒河粉
package pers.zuo.component.restaurant.meal;
/**
* @author zuojingang
* @Title: Powder
* @Description: 炒河粉
* @date 2019-09-11 17:07
*/
public class Powder implements IMeal {
@Override
public String getDescription() {
return "炒河粉";
}
@Override
public double cost() {
return 9.0;
}
}
调料装饰器抽象类
package pers.zuo.component.restaurant.condiment;
import pers.zuo.component.restaurant.meal.IMeal;
/**
* @author zuojingang
* @Title: Seasoning
* @Description: 调料/加料的餐
* @date 2019-09-11 16:34
*/
public abstract class AbstractCondimentDecorator implements IMeal {
protected final IMeal IMeal;
public AbstractCondimentDecorator(IMeal IMeal) {
this.IMeal = IMeal;
}
}
西红柿
package pers.zuo.component.restaurant.condiment;
import pers.zuo.component.restaurant.meal.IMeal;
/**
* @author zuojingang
* @Title: Tomato
* @Description: 西红柿
* @date 2019-09-11 17:13
*/
public class Tomato extends AbstractCondimentDecorator {
public Tomato(IMeal IMeal) {
super(IMeal);
}
@Override
public String getDescription() {
return "西红柿" + IMeal.getDescription();
}
@Override
public double cost() {
return IMeal.cost() + 2.0;
}
}
鸡蛋
package pers.zuo.component.restaurant.condiment;
import pers.zuo.component.restaurant.meal.IMeal;
/**
* @author zuojingang
* @Title: Egg
* @Description: 鸡蛋
* @date 2019-09-11 17:01
*/
public class Egg extends AbstractCondimentDecorator {
public Egg(IMeal IMeal) {
super(IMeal);
}
@Override
public String getDescription() {
return "鸡蛋" + IMeal.getDescription();
}
@Override
public double cost() {
return IMeal.cost() + 1.0;
}
}
肉丝
package pers.zuo.component.restaurant.condiment;
import pers.zuo.component.restaurant.meal.IMeal;
/**
* @author zuojingang
* @Title: Meat
* @Description: 肉丝
* @date 2019-09-11 17:18
*/
public class Meat extends AbstractCondimentDecorator {
public Meat(IMeal IMeal) {
super(IMeal);
}
@Override
public String getDescription() {
return "肉丝" + IMeal.getDescription();
}
@Override
public double cost() {
return IMeal.cost() + 3.5;
}
}
厨房
package pers.zuo.component.restaurant;
import com.sun.istack.internal.NotNull;
import pers.zuo.component.restaurant.meal.IMeal;
import pers.zuo.component.restaurant.meal.Noodles;
import pers.zuo.component.restaurant.meal.Powder;
import pers.zuo.component.restaurant.condiment.AbstractCondimentDecorator;
import pers.zuo.component.restaurant.condiment.Egg;
import pers.zuo.component.restaurant.condiment.Meat;
import pers.zuo.component.restaurant.condiment.Tomato;
import java.lang.reflect.InvocationTargetException;
/**
* @author zuojingang
* @Title: Kitchen
* @Description: 厨房/调制器
* @date 2019-09-11 17:34
*/
public class Kitchen {
public static IMeal cooking(@NotNull Class<? extends IMeal> meal, Class<? extends AbstractCondimentDecorator>... condiments){
IMeal IMealInstance = null;
try {
IMealInstance = meal.newInstance();
} catch (InstantiationException |IllegalAccessException e) {
e.printStackTrace();
return null;
}
for (Class<? extends AbstractCondimentDecorator> decorator: condiments){
try {
IMealInstance = decorator.getConstructor(IMeal.class).newInstance(IMealInstance);
} catch (InstantiationException | IllegalAccessException |InvocationTargetException |NoSuchMethodException e) {
e.printStackTrace();
}
}
return IMealInstance;
}
public static void main(String[] args){
/**
* 支个摊子
*/
IMeal IMeal = cooking(Noodles.class, Meat.class);
System.out.println(composeMenuItem(IMeal.getDescription(), IMeal.cost()));
IMeal IMeal1 = cooking(Noodles.class, Egg.class, Tomato.class);
System.out.println(composeMenuItem(IMeal1.getDescription(), IMeal1.cost()));
IMeal IMeal2 = cooking(Powder.class, Meat.class);
System.out.println(composeMenuItem(IMeal2.getDescription(), IMeal2.cost()));
IMeal IMeal3 = cooking(Powder.class, Egg.class, Tomato.class);
System.out.println(composeMenuItem(IMeal3.getDescription(), IMeal3.cost()));
}
public static String composeMenuItem(String description, double cost){
return description + " " + cost + "元";
}
}
运行结果
肉丝炒面 11.5元
西红柿鸡蛋炒面 11.0元
肉丝炒河粉 12.5元
西红柿鸡蛋炒河粉 12.0元