В моем приложении есть действия, которые могут выполнять пользователи, включая поддержку redo
.
Поэтому я почувствовал необходимость управлять, объективизировав 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. Do Action
в любом месте 2 пути
CotainerActions.CREATE.run()
RecoverableAction.List.CONTAINER_COPY.action.run()
Мне не нравится использовать static
переменные, но я не хочу, чтобы каждый Action
создавался каждый раз, когда он выполняется пользователем. Я также реализовал его как companion
, чтобы я мог запустить соответствующий Action
напрямую из нескольких разных классов.
Кроме того, мне нужно реализовать функцию redo
, управляя действиями, выполняемыми пользователем как stack
. Причина, по которой я реализовал действие, поддерживаемое RecoverableAction
как enum
, заключается в том, что я хочу управлять им в Action record stack
с помощью name
, а не Action object
.
Я много думал о разработке структуры для реализации этих требований, но я думаю, что это может быть хорошей структурой. Может ли это быть "хороший путь"?