// 기초 커맨드 클래스는 모든 구상 커맨드에 대한 공통 인터페이스를 정의합니다.
abstract class Command is
protected field app: Application
protected field editor: Editor
protected field backup: text
constructor Command(app: Application, editor: Editor) is
this.app = app
this.editor = editor
// 편집기의 상태에 대한 백업을 만드세요.
method saveBackup() is
backup = editor.text
// 편집기의 상태를 복원하세요.
method undo() is
editor.text = backup
// 실행 메서드는 모든 구상 커맨드들이 자체 구현을 제공하도록 강제하기 위해
// 추상으로 선언됩니다. 이 메서드는 커맨드가 편집기의 상태를 변경하는지에 따라
// 진실 또는 거짓을 반환해야 합니다.
abstract method execute()
// 구상 커맨드들은 여기에 배치됩니다.
class CopyCommand extends Command is
// 복사 커맨드는 편집기의 상태를 변경하지 않으므로 기록에 저장되지 않습니다.
method execute() is
app.clipboard = editor.getSelection()
return false
class CutCommand extends Command is
// cut 커맨드는 편집기의 상태를 변경하므로 기록에 반드시 저장되어야 하며,
// 메서드가 true를 반환하는 한 저장됩니다.
method execute() is
saveBackup()
app.clipboard = editor.getSelection()
editor.deleteSelection()
return true
class PasteCommand extends Command is
method execute() is
saveBackup()
editor.replaceSelection(app.clipboard)
return true
// 실행취소 작업도 커맨드입니다.
class UndoCommand extends Command is
method execute() is
app.undo()
return false
// 글로벌 커맨드 기록도 스택일 뿐입니다.
class CommandHistory is
private field history: array of Command
// 후입 …
method push(c: Command) is
// 커맨드를 기록 배열의 끝으로 푸시하세요.
// … 선출
method pop():Command is
// 기록에서 가장 최근 명령을 가져오세요.
// 편집기 클래스에는 실제 텍스트 편집 기능이 있습니다. 이는 수신기의 역할을
// 합니다. 모든 커맨드들은 결국 편집기의 메서드들에 실행을 위임합니다.
class Editor is
field text: string
method getSelection() is
// 선택된 텍스트를 반환하세요.
method deleteSelection() is
// 선택된 텍스트를 삭제하세요.
method replaceSelection(text) is
// 현재 위치에 클립보드의 내용을 삽입하세요.
// 앱 클래스는 객체 관계들을 설정하며 발신자 역할을 합니다. 이것은 무언가를
// 수행해야 할 때 커맨드 객체를 만들고 실행합니다.
class Application is
field clipboard: string
field editors: array of Editors
field activeEditor: Editor
field history: CommandHistory
// 사용자 인터페이스 객체들에 커맨드들을 할당하는 코드는 다음과 같을 수
// 있습니다.
method createUI() is
// …
copy = function() { executeCommand(
new CopyCommand(this, activeEditor)) }
copyButton.setCommand(copy)
shortcuts.onKeyPress("Ctrl+C", copy)
cut = function() { executeCommand(
new CutCommand(this, activeEditor)) }
cutButton.setCommand(cut)
shortcuts.onKeyPress("Ctrl+X", cut)
paste = function() { executeCommand(
new PasteCommand(this, activeEditor)) }
pasteButton.setCommand(paste)
shortcuts.onKeyPress("Ctrl+V", paste)
undo = function() { executeCommand(
new UndoCommand(this, activeEditor)) }
undoButton.setCommand(undo)
shortcuts.onKeyPress("Ctrl+Z", undo)
// 커맨드를 실행하여 기록에 추가해야 하는지 확인하세요.
method executeCommand(command) is
if (command.execute())
history.push(command)
// 기록에서 가장 최근의 커맨드를 가져와서 그의 실행 취소 메서드를 실행하세요.
// 참고로 우리는 이 커맨드의 클래스를 알지 못한다는 사실에 유념하세요.
// 하지만 몰라도 상관없는데, 그 이유는 커맨드가 자신의 작업을 실행 취소하는
// 법을 알기 때문입니다.
method undo() is
command = history.pop()
if (command != null)
command.undo()
Command
스프링의 Command
는 컨트롤러의 요청을 처리하는 역할을 합니다. Command
인터페이스를 구현한 클래스는 다양한 요청을 처리할 수 있습니다. 예를 들어, SaveUserCommand
클래스는 사용자를 저장하는 요청을 처리하고, DeleteUserCommand
클래스는 사용자를 삭제하는 요청을 처리합니다.
Command
는 명령 패턴을 사용하여 구현되었습니다. Command
인터페이스는 요청을 처리하는 알고리즘을 정의하는 추상 메서드 execute()
를 제공합니다. 각 Command
구현체는 execute()
메서드를 구현하여 특정 요청을 처리하는 알고리즘을 제공합니다.
Runnable
자바의 Runnable
인터페이스는 스레드를 실행하는 역할을 합니다. Runnable
인터페이스를 구현한 클래스는 스레드에서 실행할 작업을 정의할 수 있습니다. 예를 들어, PrintMessageRunnable
클래스는 콘솔에 메시지를 출력하는 작업을 정의합니다.
Runnable
은 명령 패턴을 사용하여 구현되었습니다. Runnable
인터페이스는 스레드에서 실행할 작업을 정의하는 추상 메서드 run()
를 제공합니다. 각 Runnable
구현체는 run()
메서드를 구현하여 스레드에서 실행할 작업을 정의합니다.
Button
웹 브라우저의 Button
은 사용자의 클릭을 처리하는 역할을 합니다. Button
은 클릭 이벤트를 발생시킬 때, Command
객체를 전달할 수 있습니다. Command
객체는 클릭 이벤트를 처리하는 역할을 합니다.
웹 브라우저의 Button
은 명령 패턴을 사용하여 구현되었습니다. Command
객체는 클릭 이벤트를 처리하는 알고리즘을 정의합니다.
명령 패턴은 다음과 같은 장점이 있습니다.
명령 패턴은 다양한 프레임워크에서 적용되어, 애플리케이션의 개발과 유지보수를 보다 쉽고 효율적으로 만들어 줍니다.
다음은 명령 패턴이 적용된 프레임워크의 서비스의 예입니다.
CommandController
스프링의 CommandController
는 Command
객체를 사용하여 요청을 처리하는 컨트롤러입니다. CommandController
는 Command
객체의 execute()
메서드를 호출하여 요청을 처리합니다.
ExecutorService
자바의 ExecutorService
는 스레드를 실행하는 서비스입니다. ExecutorService
는 Runnable
객체를 사용하여 스레드를 실행합니다.
onClick()
이벤트웹 브라우저의 Button
은 onClick()
이벤트를 발생시킬 수 있습니다. onClick()
이벤트는 Button
이 클릭되었을 때 발생합니다. onClick()
이벤트의 핸들러는 Command
객체를 전달받을 수 있습니다.