装饰器模式-小餐馆

我家小餐馆

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元
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值