μμ²μ κ°μ²΄μ ννλ‘ μΊ‘μννμ¬ μ¬μ©μκ° λ³΄λΈ μμ²μ λμ€μ μ΄μ©ν μ μλλ‘ λ§€μλ μ΄λ¦, λ§€κ°λ³μ λ± μμ²μ νμν μ 보λ₯Ό μ μ₯ λλ λ‘κΉ , μ·¨μν μ μκ² νλ ν¨ν΄μ΄λ€.
- μνν λμμ κ°μ²΄λ‘ λ§€κ°λ³μννκ³ μ ν λ
- μλ‘ λ€λ₯Έ μκ°μ μμ²μ λͺ μνκ³ , μ μ₯νλ©°, μ€ννκ³ μΆμ λ
- μ€ν μ·¨μ κΈ°λ₯μ μ§μνκ³ μΆμ λ
- μμ€ν μ΄ κ³ μ₯ λ¬μ λ μ¬μ μ©μ΄ κ°λ₯νλλ‘ λ³κ²½ κ³Όμ μ λν λ‘κΉ μ μ§μνμ¬ λ‘κΉ λ λͺ λ Ήμ΄λ₯Ό λ€μ μ¬μ€ν νκ³ μ ν λ
abstract class Command {
abstract fun execute()
}
class Pen : Command() {
override fun execute() {
println("draw something with pen")
}
}
class Shape(val shape: String) : Command() {
override fun execute() {
println("draw $shape")
}
}
class PaintBucket : Command() {
override fun execute() {
println("fill inside")
}
}
class Eraser : Command() {
override fun execute() {
println("erase")
}
}
class Canvas {
private val commands = Stack<Command>()
private val canceledCommands = Stack<Command>()
fun draw(cmd: Command) {
commands.push(cmd)
if (canceledCommands.isNotEmpty()) canceledCommands.clear()
}
fun undo() {
if (commands.isNotEmpty()) canceledCommands.push(commands.pop())
}
fun redo() {
if (canceledCommands.isNotEmpty()) commands.push(canceledCommands.pop())
}
fun show() {
commands.forEach { it.execute() }
}
}
fun main() {
val canvas = Canvas()
//tools
val pen = Pen()
val paintBucket = PaintBucket()
val eraser = Eraser()
val rectangle = Shape("rectangle")
val triangle = Shape("triangle")
canvas.draw(pen)
canvas.draw(pen)
canvas.draw(pen)
canvas.undo()
canvas.draw(paintBucket)
canvas.draw(triangle)
canvas.draw(eraser)
canvas.draw(eraser)
canvas.undo()
canvas.undo()
canvas.redo()
canvas.draw(rectangle)
canvas.draw(paintBucket)
canvas.show()
}