java - 以这种方式使用伴生对象(静态)可能是一个很好的例子吗?
问题描述
在我的应用程序中,用户可以执行一些操作,包括redo
支持。
因此,我觉得有必要通过 objectizing 来管理Action
,并实现如下。
1.实施 RecoverableAction
abstract class RecoverableAction {
abstract fun getActionName(): String
abstract fun run()
abstract fun undoActionName(): String
enum class List(val action: RecoverableAction) {
CONTAINER_CREATE(ContainerActions.CREATE),
CONTAINER_COPY(ContainerActions.COPY),
CONTAINER_DELETE(ContainerActions.DELETE)
}
}
2. Actions
实施Redo
class ContainerActions private constructor() {
companion object {
val CREATE = object : RecoverableAction {
override fun run() {
//do create
}
override fun getActionName() = List.CONTAINER_CREATE.name
override fun undoActionName() = List.CONTAINER_DELETE.name
}
val DELETE = object : RecoverableAction {
override fun run() {
//do create
}
override fun getActionName() = List.CONTAINER_CREATE.name
override fun undoActionName() = List.CONTAINER_DELETE.name
}
val COPY = object : RecoverableAction {
override fun run() {
//do copy
}
override fun getActionName() = List.CONTAINER_CREATE.name
override fun undoActionName() = List.CONTAINER_DELETE.name
}
}
}
3.做Action
任何地方2方式
CotainerActions.CREATE.run()
RecoverableAction.List.CONTAINER_COPY.action.run()
我不喜欢使用static
变量,但我不希望每次Action
从用户执行时都实例化每个变量。我还将它实现为一个companion
,以便我可以Action
直接从几个不同的类中运行相应的。
此外,我需要redo
通过将用户执行的操作作为stack
. 我实现 Action supported by RecoverableAction
as anenum
的原因是因为我想在Action record stack
byname
而不是Action object
.
我一直在考虑设计结构来实现这些要求,但我认为这可能是一个很好的结构。这会是一个“好方法”吗?
解决方案
对我来说,
RecoverableAction.List.CONTAINER_COPY.action.run()
看起来很乱
为什么不:
sealed class RecoverableActions {
abstract val actionName: String
abstract val undoActionName: String
abstract fun run()
object CreateAction : RecoverableActions() {
override fun run() {
//do create
}
override val actionName = CreateAction::class.java.simpleName
override val undoActionName = DeleteAction::class.java.simpleName
}
object DeleteAction : RecoverableActions() {
override fun run() {
//do create
}
override val actionName = DeleteAction::class.java.simpleName
override val undoActionName = CreateAction::class.java.simpleName
}
object CopyAction : RecoverableActions() {
override fun run() {
//do create
}
override val actionName = CopyAction::class.java.simpleName
override val undoActionName = CopyAction::class.java.simpleName // ?
}
}
和
RecoverableActions.CreateAction.run()
推荐阅读
- mysql - 操作数应在 DELETE 上包含 1 列,但仅选择 1 列
- python - 使用 get_dummies 将分类值转换为数字?
- c# - C# 中的 Fire and Forget 多个方法
- sql - 如何插入存储在另一个表中的日期值并将其增加 x 天?
- mysql - 嵌套 JOIN 以创建自定义动态列
- javascript - 使用 laravel-mix 在 vue 中使用动态导入的组件是否安全
- angular - 如何从 http 请求将数据传递给 ng2-smart-table renderComponent?
- python - 使用 ib insync (Python) 从 IB api 获取选项链
- python - 将 Excel 文档导入 Python 的基本知识
- memory-address - 如何在知道操作数地址的位的情况下确定以字节为单位的可寻址内存容量?