[행위패턴]커맨드패턴-자바Runnable,웹onClick()

____·2024년 8월 13일
0

[JAVA디자인패턴]

목록 보기
8/8
post-thumbnail

패턴 코드

// 기초 커맨드 클래스는 모든 구상 커맨드에 대한 공통 인터페이스를 정의합니다.
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

스프링의 CommandControllerCommand 객체를 사용하여 요청을 처리하는 컨트롤러입니다. CommandControllerCommand 객체의 execute() 메서드를 호출하여 요청을 처리합니다.

  • 자바의 ExecutorService

자바의 ExecutorService는 스레드를 실행하는 서비스입니다. ExecutorServiceRunnable 객체를 사용하여 스레드를 실행합니다.

  • 웹 브라우저의 onClick() 이벤트

웹 브라우저의 ButtononClick() 이벤트를 발생시킬 수 있습니다. onClick() 이벤트는 Button이 클릭되었을 때 발생합니다. onClick() 이벤트의 핸들러는 Command 객체를 전달받을 수 있습니다.

0개의 댓글