Java设计模式的建议

时间:2018-10-31 20:01:18

标签: java design-patterns

我开始在Java中使用设计模式。现在,我正在编写通过所有这些测试的Java代码:

@Test
    public void createOrder() {
        final Restaurant restaurant = new Restaurant();
        final int tableId = restaurant.initTable(4);
        restaurant.customerSays(tableId, "Joe: Soup");
        restaurant.customerSays(tableId, "Jim: Same");
        restaurant.customerSays(tableId, "Jack: Chips");
        restaurant.customerSays(tableId, "John: Chips");
        assertEquals("Soup, Soup, Chips, Chips",
                restaurant.createOrder(tableId));
    }

    @Test
    public void failedCreationBecauseNotEveryoneOrdered() {
        final Restaurant restaurant = new Restaurant();
        final int tableId = restaurant.initTable(4);
        restaurant.customerSays(tableId, "Joe: Soup");
        restaurant.customerSays(tableId, "Joe: Spaghetti");
        restaurant.customerSays(tableId, "Jim: Roastbeef");
        assertEquals("MISSING 2", restaurant.createOrder(tableId));
        restaurant.customerSays(tableId, "Jack: Spaghetti");
        restaurant.customerSays(tableId, "John: Chips");
        assertEquals("Spaghetti, Roastbeef, Spaghetti, Chips",
                restaurant.createOrder(tableId));
    }

    @Test
    public void failedCreationBecauseNotEnoughPeopleForADishFor2() {

        final Restaurant restaurant = new Restaurant();
        final int tableId = restaurant.initTable(4);
        restaurant.customerSays(tableId, "Joe: Soup");
        restaurant.customerSays(tableId, "Jim: Same");
        restaurant.customerSays(tableId, "Joe: Fish for 2");
        restaurant.customerSays(tableId, "Jack: Chips");
        restaurant.customerSays(tableId, "John: Chips");
        assertEquals("MISSING 1 for Fish for 2",
                restaurant.createOrder(tableId));
        restaurant.customerSays(tableId, "John: Fish for 2");
        assertEquals("Fish for 2, Soup, Chips, Fish for 2",
                restaurant.createOrder(tableId));
    }

我开始使用Factory设计模式:

mydesign  但是我认为它不是正确的选择!有什么建议吗?

1 个答案:

答案 0 :(得分:1)

我在这里看到三种模式的机会:

  • 用于对Restaurant类进行建模的 facade 模式:看来Restaurant应该包含其自己的模型和子模式,并且只暴露所有访问它们所需的方法。

  • 用于实现customerSays方法的 command 模式:最有可能的是,它应私下创建一个对象以对请求的操作进行建模。

  • parser 模式(哦,好的:我不知道它是否可以被认为是一种模式,但是这里仍然需要一个解析器):这个将采用字符串参数customerSays中的一个,按char对其进行分析,并生成具有特定属性的特定javabean。

无论如何,如果您以最合理的方式设计对象和关系的模型来完成给定的测试,而又不十分注意确切的方法签名,则将更加清楚。然后,当您最终获得它时,设计Restaurant类将它们分组在一起,现在考虑请求的方法签名。