목차
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();
}
}
실행 결과
디자인 패턴
디자인 패턴
참조