본문 바로가기

카테고리 없음

9. 커맨드 패턴 / Command Pattern

 목차

1. 커맨드 패턴이란?

2. 커맨드 패턴 구조

3. 예시


커맨드 패턴 (Command Pattern)이란?

 

하나의 명령(기능)을 객체화한 패턴

 

객체는 전달할 수 있고 보관할 수 있음, 즉 명령 (기능) 을 전달하고 보관할 수 있게 됨

 

배치 실행, Undo/Redo, 우선수위가 높은 명령을 먼저 실행하기 등이 가능해 짐

 


 

커맨드 패턴 구조 (Command Patteren Structure ) 예시 

 

 

 

 

 

이름 내용
Command Command 기능을 추상화 한 인터페이스
ClearCommand 지우기를 담당하는 클래스
PrintCommand 출력을 담당하는 클래스
ColorCommand 색상부여를 담당하는 클래스
CommandGroup 일괄 명령을 담당하는 클래스
Main 메인 클래스

 


 

예시 

 

Command 인터페이스

 

명령을 실행할 run 메서드를 추상화합니다.

 

public interface Command {
    void run();
}

 

 

ClearCommand 클래스

 

Command 인터페이스를 구현합니다. 

 

public class ClearCommand implements Command{
    @Override
    public void run() {
        System.out.println("\033[H\033[2J");
        System.out.flush();
    }
}

 

 

 

PrintCommand 클래스

 

Command 인터페이스를 구현합니다.

 

public class PrintCommand implements Command{

    private String content;

    public PrintCommand(String content) {
        this.content = content;
    }
    @Override
    public void run() {
        System.out.println(content);
    }
}

 

 

 

ColorCommand 클래스

 

색상을 Color enum 으로 정의하고 Color enum 을 필드로 가집니다.

 

Command 인터페이스를 구현합니다.

 

public class ColorCommand implements Command{

    public enum Color {
        BLACK("\u001B[30m"), RED("\u001B[31m"),
        GREEN("\u001B[32m"), YELLOW("\u001B[33m"),
        BLUE("\u001B[34m"), PURPLE("\u001B[35m"),
        CYAN("\u001B[36m"), WHITE("\u001B[37m");

        final private String code;
        Color(String code) {
            this.code = code;
        }

        public String getCode() {
            return code;
        }
    }

    private Color color;

    public ColorCommand(Color color) {
        this.color = color;
    }

    @Override
    public void run() {
        System.out.println(color.getCode());
    }

}

 

 

CommandGroup 클래스

 

Command 를 담아둘 배열을 필드로 가지고 add 메서드를 통해 등록할 수 있도록 만듭니다.

 

Override 한 run 메서드에서 Iterator 패턴을 이용하여 하나씩 실행 시킵니다.

 

public class CommandGroup implements Command{
    private ArrayList<Command> commands = new ArrayList<>();

    public void add(Command command) {
        commands.add(command);
    }


    @Override
    public void run() {
        Iterator<Command> iter = commands.iterator();
        while (iter.hasNext()) {
            Command command = iter.next();
            command.run();
        }
    }
}

 

 

Main 클래스

 

구현한 Command 들을 생성하여 순서대로 실행해 봅니다.

 

 

public class Main {

    public static void main(String[] args) {

        Command clearCommand = new ClearCommand();
        clearCommand.run();

        Command yellowColorCommand = new ColorCommand(ColorCommand.Color.YELLOW);
        yellowColorCommand.run();

        Command printCommand = new PrintCommand("디자인 패턴");
        printCommand.run();
        
        
    }
}

 

 

실행 결과

디자인 패턴
디자인 패턴

 

 

다음으로 CommandGroup 클래스를 이용하여 일괄 실행 시켜 보겠습니다.

 

동일한 결과를 얻을 수 있습니다.

 

public class Main {

    public static void main(String[] args) {

        Command clearCommand = new ClearCommand();
        Command yellowColorCommand = new ColorCommand(ColorCommand.Color.YELLOW);
        Command printCommand = new PrintCommand("디자인 패턴");
        Command redColorCommand = new ColorCommand(ColorCommand.Color.RED);

        CommandGroup commandGroup = new CommandGroup();
        commandGroup.add(clearCommand);
        commandGroup.add(yellowColorCommand);
        commandGroup.add(printCommand);
        commandGroup.add(redColorCommand);
        commandGroup.add(printCommand);

        commandGroup.run();

    }
}

 

 

실행 결과

디자인 패턴
디자인 패턴


참조

 

 

https://www.youtube.com/watch?v=sYIB1VrN1ik&t=1s