1

这似乎是一个奇怪的问题,但我正在尝试练习编写可重用的代码,或者至少尝试以正确的方式思考它,如果你明白我的意思吗?我有一个任务,涉及编写一个带有几个不同菜单的文本界面。所以有两种方法:(1)每个菜单的一个类(草率)或(2)一个包含所有菜单信息的类(不是草率)。

现在我正在写这篇文章,感觉这可能是一种不好的做法,但是是否有可能拥有一个包含菜单基本组件(标题、MenuOptions 列表等)的类,但是可以在以下位置添加方法下一次?

或者,如果这是不可能/不可取的,这将是做这样的事情的普遍首选方式,(a)单独菜单的单独类,或(b)一个包含不同菜单所有代码的大类?

4

4 回答 4

1

您可能会混淆拥有不同的和拥有不同的类实例。例如,您可以有一个菜单类,但该类有两个不同的对象,每个菜单一个,每个都有自己的一组数据来描述菜单项和它们的作用,因为每个几乎都以相同的方式工作,但是在不同的数据上。

或者,如果菜单行为不同但有一些共性,您可能希望为公共位定义一个类,然后创建子类,每个子类都详细说明是什么使这种菜单与众不同。

于 2015-08-20T15:15:05.853 回答
1

我想我理解你的意思,但我也认为当你说but the methods can be added at another time?你的意思是方法所做的事情是在另一个时间添加的

就您而言,菜单通常需要处理一些基本的事情,例如

  • 显示实际的菜单文本(我们称之为标题);
  • 显示工具提示;
  • 点击时做某事。
  • 子子菜单项。

为了实现这一点,您可以使用两种方法之一或混合使用两种方法:

  1. 策略设计模式。
  2. 抽象类。

策略设计模式允许您指定一种行为,然后将其传递给知道如何处理该行为的某个类。简而言之,您的行为可能是单击菜单项时发生的情况。因此,基本上,您的菜单类在单击时知道要做什么,但它知道将调用委托给谁。这种方法将允许您拥有一个Menu类和几个可以访问的行为。

使用抽象类类似于使用设计模式,但是,您最终会为每个想要拥有的不同菜单创建一个新的具体类。

因此,我认为最好的结果会介于两者之间。

例如,您可以将Menu父类创建为abstract,具有诸如 , 等属性TitleTooltip然后您可以添加一个名为的方法,该方法onActionPerformed接受一些对象,该对象处理单击菜单项时发生的情况。最后,您可以创建抽象方法,例如onBeforeActionPerformedand onAfterActionPerformed,这本质上是拦截器,允许您在事件处理之前和之后执行逻辑。

然后,您可以使用诸如此类的东西来扩展Menu该类NonInterceptibleMenu以处理不同的场景。

于 2015-08-20T15:14:24.710 回答
1

您可以为菜单项和菜单本身(作为菜单项的集合)设置一个通用类。这些类不包含有关点击行为的任何逻辑,但它们只会涵盖一般部分,如 UI、布局、标题占位符 - 一般配置。

您可以“稍后添加方法”。这可以通过委托或 lambda 函数来实现。在 Java 中,您可能会在 Swing 中遇到类似的配置,当您有按钮和单击侦听器(甚至是菜单。您可以看看 JMenuBar、JMenu、JMenuItem 类的用法,它们的界面可能对您来说很有趣)。

当“方法被添加”为匿名类时,您可能会遇到很多示例,这是在 lambda 函数到达 Java 8 之前

于 2015-08-20T15:29:29.340 回答
0

是否可以有一个类包含菜单的基本组件(标题、MenuOptions 列表等),但可以在其他时间添加方法?

从基本的“编码”角度来看,您可以创建一个abstract class声明中心组件的位置(确保它们未在private范围内声明),然后将第二个类写入extend您的抽象类,在其中声明您的方法。除非您打算让多个类扩展您的抽象类,否则没有真正需要创建这种分离。

你没有提供足够的整体项目范围,所以我会保留我的答案。

于 2015-08-20T15:14:21.367 回答