这似乎是一个奇怪的问题,但我正在尝试练习编写可重用代码,或者至少尝试练习以正确的方式思考它,如果你明白我的意思吗?我有一个作业,涉及到写一个文本界面与几个不同的菜单。因此有两种方法:(1)为每个菜单创建一个类(草率)或(2)创建一个包含所有菜单信息的类(不草率)。
现在我正在写这篇文章,感觉这可能是不好的做法,但是有可能有一个类包含菜单的基本组件(标题,菜单选项列表等),但方法可以在另一个时间添加?
或者,如果这是不可能的/不可取的,这将是做这样的事情的一般首选方式,(a)单独的类单独的菜单,或(b)一个大的类包含所有的代码不同的菜单?
我想我理解你的意思,但我也认为当你说but the methods can be added at another time?
时,你的意思是方法所做的是在另一个时间添加。
菜单,在您的情况下,通常需要照顾一些基本的东西,如
- 显示实际的菜单文本(我们称之为title);
- 显示工具提示;
- 点击时正在做某事
- 子菜单项
要实现这一点,您可以使用或混合使用以下两种方法:
- 策略设计模式
- 抽象类。
策略设计模式允许你指定一种行为,然后把它传递给某个知道该如何处理该行为的类。简而言之,您的行为可能是单击菜单项时发生的情况。基本上,你的菜单类会不知道当它被点击时该做什么,但它会知道调用将被委托给谁。这种方法将允许您拥有一个Menu
类和它可以访问的几个行为。
使用抽象类类似于使用设计模式,但是,您最终会为每个您想要拥有的不同菜单创建一个新的具体类。
因此,我认为最好的结果是介于两者之间。
例如,你可以创建你的Menu
父类abstract
,与属性,如Title
, Tooltip
等。然后,您可以添加一个名为onActionPerformed
的方法,该方法接受一些对象,该对象处理单击菜单项时发生的事情。最后,您可以创建抽象方法,如onBeforeActionPerformed
和onAfterActionPerformed
,这本质上是拦截器,允许您在事件处理之前和之后执行逻辑。
你可以用NonInterceptibleMenu
之类的东西来扩展Menu
类来处理不同的场景。
您可能会混淆使用不同的类与使用一个类的不同实例。例如,你可以有一个用于菜单的类,但这个类的两个不同对象,每个菜单一个,每个都有自己的一组数据来描述菜单项和它们的作用,因为每个都以相同的方式工作,但在不同的数据上。
或者,如果菜单的行为不同,但有一些共性,您可能希望为公共位定义一个类,然后创建子类,每个子类都包含关于如何将这种菜单区分开来的详细信息。
您可以为菜单项和菜单本身(作为菜单项的集合)创建一个通用类。这些类不会包含任何关于点击行为的逻辑,但它们只会涵盖一般部分,如UI,布局,标题占位符-一般配置。
你可以有'以后添加的方法'。这可以通过委托或lambda函数来实现。在Java中,您可能在Swing中遇到过类似的配置,当您有按钮和单击侦听器(甚至菜单)时。你可以看看JMenuBar, JMenu, JMenuItem类的用法,它们的接口可能会让你感兴趣。
你可能遇到过很多匿名类添加方法的例子,这是在Java 8中出现lambda函数之前
是否可能有一个类包含菜单的基本组件(标题,菜单选项列表等),但方法可以在另一个时间添加?
从基本的"编码"角度来看,您可以创建一个abstract class
,在这里声明您的中心组件(确保它们不在private
范围内声明),然后在extend
中编写第二个类,您的抽象类,在这里声明您的方法。除非您计划使用多个类来扩展抽象类,否则实际上并不需要创建这种分离。
你没有提供足够的整体项目范围,所以我将保留我的答案。