我开始在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 但是我认为它不是正确的选择!有什么建议吗?
答案 0 :(得分:1)
我在这里看到三种模式的机会:
用于对Restaurant
类进行建模的 facade 模式:看来Restaurant
应该包含其自己的模型和子模式,并且只暴露所有访问它们所需的方法。
用于实现customerSays
方法的 command 模式:最有可能的是,它应私下创建一个对象以对请求的操作进行建模。
parser 模式(哦,好的:我不知道它是否可以被认为是一种模式,但是这里仍然需要一个解析器):这个将采用字符串参数customerSays
中的一个,按char对其进行分析,并生成具有特定属性的特定javabean。
无论如何,如果您以最合理的方式设计对象和关系的模型来完成给定的测试,而又不十分注意确切的方法签名,则将更加清楚。然后,当您最终获得它时,设计Restaurant
类将它们分组在一起,现在考虑请求的方法签名。