面试问题:热狗,薯条,饮料,餐(面向对象设计,设计模式。)

时间:2011-02-20 03:31:23

标签: design-patterns oop

设计一个关于食品车的系统。假设你有热狗,薯条和饮料出售,顾客也可以做饭。

1.为这种情况设计一个系统。

2您可以在这里使用哪些设计模式?描述一下?

任何人都可以给我一些提示吗?您可以提供简短的想法或详细说明。 谢谢你们。

2 个答案:

答案 0 :(得分:6)

可以生成FoodCart的多个实例的FoodCartFactory。

FoodCart是主要的课程。

您需要使用IoC,因为购物车应该对所销售的食品类型无动于衷。购物车有一个FoodItem抽象类后代实例的哈希表,代表销售的各种商品。

使用DI也是一个好主意,因为价格可能因位置等而有所不同,因此工厂必须使用控制价格的PolicyManager对象配置购物车。

此外,FoodCartController将确保购物车中有正确的物品。

您还需要一个代表FoodSale消息目标的CartCustomer对象,该对象将包含项目,金额和价格(当然包括适当的税金)。

您还需要一个名为ProfitMaximizer的类中的业务逻辑,其中计算出售的内容和数量,以便将必要的FoodNeeded消息传递给FoodController。

当然,如果没有某种分析,ProfitMaximizer就无法正常运行,可能在名为FoodStatistics的类中,它跟踪销售,趋势,利润,客户数量等。

您还需要某种诊断支持,由名为FoodCartLogger的类表示,以收集有关诊断和解决问题的信息。

显然,您还需要关注购物车的性能,因此FoodCartPerfMonitor是合法的。

然后,我们不应该跳过这个购物车需要为世界各地的客户提供服务的可能性,所以你显然需要ResourceManager和FoodCartLocalizer。

您还需要一个子系统来根据收入和支出流量跟踪可用资本。我们称之为FoodCartAccountManager。

如果你还有任何利润,它应该自动投资以使收入多元化,所以当然,交易所交易所课程也不会毫无疑问。

由于购物车由人操纵,您还需要供应商类。供应商往往会相对较短,因此您将需要使用VendorManager类进行大量的流失。

当然,所有这些课程都是控制一辆车所必需的;如果您需要设计一个可以处理多个推车的系统,您将不得不添加一些其他组件。但从好的方面来看,上面的很多类显然可以处理多个购物车,所以你可以重复使用它们。

我认为这涵盖了基本设计。

答案 1 :(得分:0)

我会做这样的事情......

class FoodCart extends Vendor {
    List<FoodItem> foodItems;
    List<Meal> meals;
}

class Vendor {
    List<SellableItem> sellableItems;
    int saleRevenue;
}

class SellableItem {
    int price;
    int quantity;

    /**
     * @return true if the item is sold out
     */
    public boolean soldOut() {
        return quantity == 0;
    }
}

class FoodItem extends SellableItem {
    Date expirationDate;
    //more food-specific variables
}

class Meal {
    FoodItem[] foodItems;

    /**
     * The meal cannot be sold if any one component making up the meal is sold out.
     * @return true, if none of this meal's components is sold out.
     */
    boolean sellable() {
        boolean result = true;
        for (int i = 0; i < foodItems.getLength(); i++) {
            result &= !foodItems[i].soldOut();
        }
        return result;
    }
}

就是这样。饮料也是FoodItems。告诉我你的想法。