【发布时间】:2017-09-25 03:17:32
【问题描述】:
我目前正在建模一个类层次结构,所以想检查是否有人有更好的方法来做到这一点。问题如下:
我有一个菜单项,里面有 id 和图标。然后我也可以拥有具有其他子菜单项的菜单项(但同时没有图标)。它基本上是子菜单项的容器,但也有 id 作为真正的菜单项。当前模型是这样的:
class SubMenuItemOrderNumber{}
class MenuItemTypeId{}
class MenuIconId{}
class MenuIcon{}
interface MenuItemWithoutSubItems{
MenuItemTypeId getTypeId();
List<MenuIcon> getIcons();
}
interface MenuItemWithSubItems{
MenuItemTypeId getTypeId();
Map<SubMenuItemOrderNumber, SubMenuItem> getOrderNumToSubMenuItem();
}
interface SubMenuItem{
SubMenuItemOrderNumber getOrderNum();
List<MenuIcon> getIcons();
}
interface Publishable{
void suspend();
void publish();
}
interface ControllableMenuItemWithoutSubItems extends MenuItemWithoutSubItems, Publishable{
void control(MenuIconId iconId, String iconData);
}
interface ControllableMenuItemWithSubItems extends MenuItemWithSubItems, Publishable{
void control(SubMenuItemOrderNumber orderNum, MenuIconId iconId, String iconData);
}
问题 - 似乎我可以让它更通用。我唯一想到的就是这种变化:
enum EnumSubMenuItemOrderNumber implements SubMenuItemOrderNumber{
ONLY_IF_MENU_ITEM_WITHOUT_SUB_ITEMS(0);
private int num;
EnumSubMenuItemTypeId(num id){
this.num = num;
}
@Override
public Integer getNum() {
return num;
}
}
class RealSubMenuItemOrderNumber implements SubMenuItemOrderNumber{
private int num;
@Override
public Integer getNum() {
return num;
}
}
interface SubMenuItemOrderNumber{
Integer getNum();
}
class MenuItemTypeId{}
class MenuIconId{}
class MenuIcon{}
interface MenuItem{
MenuItemTypeId getTypeId();
Map<SubMenuItemOrderNumber, SubMenuItem> getOrderNumToSubMenuItem();
}
interface SubMenuItem{
SubMenuItemOrderNumber getOrderNum();
List<MenuIcon> getIcons();
}
interface Publishable{
void suspend();
void publish();
}
interface ControllableMenuItem extends MenuItem, Publishable{
void control(SubMenuItemOrderNumber orderNum, MenuIconId iconId, String iconData);
}
但是问题在于,如果我想要MenuItemWithoutSubItems,我必须在Map 中创建MenuItem 和SubMenuItemTypeId,我必须使用EnumSubMenuItemTypeId.ONLY_IF_MENU_ITEM_WITHOUT_SUB_ITEMS -> 在我的情况下这是一种解决方法。类更简单,但它似乎仍然比需要的复杂。
我还有其他选择吗?
更新
这是第一个用例的潜在实现:
class DefaultMenuItemWithoutSubItems implements MenuItemWithoutSubItems {
MenuItemTypeId id;
List<MenuIcon> menuIcons;
@Override
public MenuItemTypeId getTypeId() {
return id;
}
@Override
public List<MenuIcon> getIcons() {
return menuIcons;
}
}
class DefaultMenuItemWithSubItems implements MenuItemWithSubItems {
MenuItemTypeId id;
Map<SubMenuItemOrderNumber, SubMenuItem> orderNumToSubMenuItem;
@Override
public MenuItemTypeId getTypeId() {
return id;
}
@Override
public Map<SubMenuItemOrderNumber, SubMenuItem> getOrderNumToSubMenuItem() {
return orderNumToSubMenuItem;
}
}
class DefaultSubMenuItem implements SubMenuItem {
SubMenuItemOrderNumber orderNum;
List<MenuIcon> menuIcons;
@Override
public SubMenuItemOrderNumber getOrderNum() {
return orderNum;
}
@Override
public List<MenuIcon> getIcons() {
return menuIcons;
}
}
class DefaultControllableMenuItemWithoutSubItems implements ControllableMenuItemWithoutSubItems {
MenuItemTypeId id;
List<MenuIcon> menuIcons;
boolean suspended;
@Override
public MenuItemTypeId getTypeId() {
return id;
}
@Override
public List<MenuIcon> getIcons() {
return menuIcons;
}
@Override
public void suspend() {
suspended = true;
}
@Override
public void publish() {
suspended = false;
}
@Override
public void control(MenuIconId iconId, String iconData) {
menuIcons.getById(iconId).replace(new MenuIcon(iconData));
}
}
【问题讨论】:
标签: java oop design-patterns data-modeling