1

我正在开发一个 Wicket 应用程序。但我的问题与 Wicket 无关。在那个应用程序中,我有一个水平菜单。此菜单由几个链接创建。单击链接后,您将被导航到某个页面。现在根据您当前正在查看的页面,菜单链接的 css 类属性将更改为“已选择”。这是问题的描述。

现在我通过使用整数值来解决这个问题。该值保存在会话中,并在单击任何一个链接时更新。根据保存的值,将在运行时确定“选择”哪个链接。

我正在通过以下方式实现这一点:

//On link click I set a number in session

public void onClick() {
    session.setValue(1);// or 2 or 3
}

创建菜单时,我在值之间切换并修改 css 类,如下所示:

switch(session.getValue){
    case 1: add css to home;
    case 2: add css to profile;
    // and so on.
}

我想知道这是唯一正确的方法吗?还是存在一些其他更好的技术或设计模式可以帮助我以更好的方式实现这一目标?

4

4 回答 4

4

将菜单项存储在数组(或 ArrayList)中:

items[0] = home
items[1] = profile

并使用数组的索引作为菜单标识符。当您收到选定的菜单标识符时,检索相应的项目

items[selectedItem]

如果标识符不是数字,或者不是从 0 到 N,您也可以使用 Map。

于 2012-05-05T20:40:35.397 回答
2

首先,使用 anenum或 static 常量而不是幻数 (1, 2, 3)。

于 2012-05-05T20:38:46.817 回答
1

访问者模式通常用于避免这种切换。您可能不想在您的案例中实现完整的模式,但值得了解。JB Nizet 的回答在您的情况下可能更实用。

https://en.wikipedia.org/wiki/Visitor_pattern

这些 SO 问题也可能会给您一些想法

Java 访问者模式而不是 instanceof 开关

Java Enums - Switch 语句与 Enums 上的访问者模式 - 性能优势?

于 2012-05-05T20:40:49.623 回答
0

我已经使用 EnumMap 和一个 Enum 类型作为它的键来实现它。我定义了一个枚举:

public enum NavigationStatus {
    HOME,
    PROFILE;
}

在会话中,我将当前导航的值设置为:

private NavigationStatus activeUserNavigationStatus;

public NavigationStatus getActiveUserNavigationStatus() {
    return activeUserNavigationStatus;
}

public void setActiveUserNavigationStatus(NavigationStatus activeUserNavigationStatus) {
    this.activeUserNavigationStatus = activeUserNavigationStatus;
}

我主要将其设置为:setActiveUserNavigationStatus(NavigationStatus.HOME);

现在菜单正在构建的地方我创建了一个 EnumMap:

EnumMap<NavigationStatus, Component[]> menuMap = new EnumMap<NavigationStatus, Component[]>(NavigationStatus.class);

并向其中添加了元素,例如:

menuMap.put(NavigationStatus.HOME, new Component[] { homeContainer, home });

在链接的点击方法上,我设置了状态值:

public void onClick() {
    session.setActiveUserNavigationStatus(NavigationStatus.PROFILE);
}

最后,我检查了会话中的当前值并相应地设置了 css 类:

Component[] menuComponents = menuMap.get(getSession().getActiveUserNavigationStatus());
menuComponents[0].add(new AttributeAppender("class", new Model<Serializable>(" active")));
menuComponents[1].add(new AttributeAppender("class", new Model<Serializable>(" active")));

这没有 switch 语句,并结合了JB Nizet 的ArrayList 索引和Oli Charlesworth 的Enum 的想法。

谢谢你。

于 2012-05-05T22:05:31.330 回答