我想创建一个可以有多个菜单的Restaurant对象。每个菜单可以有多个类别,每个类别可以有多个项目。每个项目都有名称,价格和描述。
--Company--
-Menu ONE-
-Menu Name-
-Category ONE-
-Category Name-
-Menu Item ONE-
-Menu Item Name
-Menu Item Price
-Menu Item Description
-Menu Item TWO-
-Category TWO-
-Menu TWO-
没有构造函数,getter / setter或方法的示例类。
拥有一系列菜单的公司
public class Company
{
// Class constants
// Class variables
private String companyName; // Stores company name
private String hours; // Restaurant hours
private String phoneNumber; // Restaurant phone number
private Menu[] menuList; // Array of menu objects
private int menuCount; // Number of menus in the array
}
包含类别数组的菜单
public class Menu
{
// Class constants
// Class variables
private String menuName; // Name of Menu
private Category[] categoryList; // Array of category objects
private int categoryCount; // Number of categories in the array
}
包含菜单项数组的类别
public class Category
{
// Class constants
// Class variables
private String categoryName; // Name of Menu
private MenuItem[] menItemList; // Array of MenuItem objects
private int menuItemCount; // Number of menu items in the array
}
包含姓名,价格和说明的单个订单项
public class MenuItem
{
// Class constants
// Class variables
private String name; // Name of Menu Item
private float price; // Price of the Menu Item
private String description; // Description of the Menu Item
}
在驱动程序类中,如果我只能访问公司的方法,我将如何更改菜单项中的任何内容?
我想过为每个私有数组项目设置一个getter,但是将3个级别挖掘到私有数组中似乎很难实现。它不像Company.Menu.Category.MenuItem.editName(newName);
那么简单注意*我对"不感兴趣;应使用链接列表或ArrayList"答案。程序要求需要基本数组。
如果我需要更清楚或者你想要一个SSCCE,请告诉我。
答案 0 :(得分:2)
我想过为每个私有数组项目设置一个getter,但是 将3个级别挖掘到私有阵列似乎非常困难 实行。它并不那么简单 Company.Menu.Category.MenuItem.editName(了newName);
实现并不困难,但它是一种反模式,可以连续调用getter,例如:
company.getMenu().getCategory().getMenuItem().editName(newName);
Demeter law 表示:
每个单位应该对其他单位的知识有限:仅 单位"密切关注"与当前单位有关。
每个单位只应与其朋友交谈;不要和陌生人说话。
只与你的直接朋友交谈。
因此,要解决您的问题,您必须重构您的设计,以便将对象从一个对象与另一个对象进行协作。
协作/级联方法
您可以定义由层次结构的每个对象连续调用的editItemName()
方法。
Company
可以定义方法,例如:
public void editItemName(String menuName, String categoryName, String itemName, String newName){
Menu menu = findMenu(menuName);
menu.editItemName(category, item, newName);
}
Menu
可以定义方法,例如:
public void editItemName(String categoryName, String itemName, String newName){
Category category = findCategory(categoryName);
category.editItemName(item, newName);
}
Category
可以定义方法,例如:
public void editItemName(String itemName, String newName){
MenuItem item = findItem(itemName);
item.editItemName(newName);
}
最后MenuItem
可以定义方法,例如:
public void editItemName(String newName){
this.name = newName;
}
更直接的方法(如果适用)
传递如此多的论点对于客户来说可能很麻烦。
作为替代,如果Item
对象是唯一的(就equals()
而言)并且您可以从客户端获取它,那么您可以使事情更简单。
您可能只需要将MenuItem
(叶子)中的方法定义为:
public void editItemName(String newName){
this.name = newName;
}
您可以定义按地址标识符存储项目的地图:
Map<String, MenuItem> mapUniqueItems = new HashMap<>();
// add items in the map
mapUniqueItems.put("item1", new MenuItem(..));
mapUniqueItems.put("item2", new MenuItem(..));
// add items in the hierarchy as you actually do
...
稍后您可以编辑其ID中的项目,例如:
String itemIdentifier = ...;
MenuItem item = mapUniqueItems.get(itemIdentifier);
item.editItemName("new value");
答案 1 :(得分:1)
如果要为必须从外部读取的成员创建getter方法,则必须深入挖掘以从Menu对象中获取所需信息。这就是封装的重点。如果将重复这些操作,您可以创建一个帮助程序类/方法来管理数组的各个级别。
答案 2 :(得分:1)
.
的链接是一种不好的做法,你可以做下面的事情
在班级公司
中创建方法modifyMenu
public class Company {
public modifyMenu (int menuIndexToModify, int categoryIndex, MenuItem itemWithModification){
menuList[menuIndexToModify].modifyMenuItem(categoryIndex, menuItemIndex, itemWithModification);
}
}
在modifyMenuItem
类
Menu
public class Menu{
public void modifyMenuItem(int categoryIndex, int menuItemIndex, MenuItem itemWithModification){
categoryList[categoryIndex].modifyMenuItem(menuItemIndex,itemWithModification);
}
}
在班级modifyMenuItem
Category
方法
public class Category{
public void modifyMenuItem(int menuItemIndex, MenuItem itemWithModification){
menuItemList[menuItemIndex].modify(itemWithModification);
}
}
modify
MenuItem
public void modify( MenuItem itemWithModification){
this.name = itemWithModification.name
// assign other stes similarly
}
现在您只需要调用方法modifyMenu
,将参数传递给它。